From 8724a2641e37af7cfbbc57e6cdb9c57a49ec9161 Mon Sep 17 00:00:00 2001 From: LabTS Date: Tue, 1 Oct 2024 23:37:39 +0100 Subject: [PATCH] provided code --- .gitignore | 26 + AUTHORS | 43 + LICENSE | 56 + Makefile | 13 + doc/.gitignore | 26 + doc/44bsd.texi | 403 + doc/Makefile | 46 + doc/alarmclock.tex | 385 + doc/bibliography.texi | 154 + doc/codebase.texi | 634 ++ doc/debug.texi | 702 ++ doc/devel.texi | 108 + doc/devices.tmpl | 51 + doc/doc.texi | 59 + doc/installation.texi | 157 + doc/intro.texi | 564 ++ doc/license.texi | 62 + doc/localgitinstructions.texi | 96 + doc/localsettings.texi | 73 + doc/pintos-ic.texi | 92 + doc/pintos-t2h.init | 16 + doc/pintos.css | 76 + doc/reference.texi | 2616 +++++++ doc/sample.tmpl | 104 + doc/standards.texi | 195 + doc/task0_questions.texi | 84 + doc/task0_sheet.texi | 11 + doc/texi2html | 6346 +++++++++++++++ doc/texinfo.tex | 6976 +++++++++++++++++ doc/threads.texi | 501 ++ doc/threads.tmpl | 108 + doc/userprog.texi | 1241 +++ doc/userprog.tmpl | 116 + doc/vm.texi | 835 ++ doc/vm.tmpl | 130 + specs/freevga/feedback.htm | 59 + specs/freevga/freevga.htm | 255 + specs/freevga/glossary.htm | 100 + specs/freevga/hardovr.htm | 92 + specs/freevga/hardrec.htm | 127 + specs/freevga/home.htm | 486 ++ specs/freevga/license.htm | 124 + specs/freevga/llintro.htm | 246 + specs/freevga/vga/256left.gif | Bin 0 -> 3395 bytes specs/freevga/vga/256left.txt | 20 + specs/freevga/vga/256right.gif | Bin 0 -> 3408 bytes specs/freevga/vga/256right.txt | 18 + specs/freevga/vga/attrreg.htm | 360 + specs/freevga/vga/char.txt | 22 + specs/freevga/vga/colorreg.htm | 253 + specs/freevga/vga/crtcreg.htm | 1355 ++++ specs/freevga/vga/extreg.htm | 282 + specs/freevga/vga/graphreg.htm | 585 ++ specs/freevga/vga/license.htm | 124 + specs/freevga/vga/paging.gif | Bin 0 -> 2540 bytes specs/freevga/vga/paging.txt | 29 + specs/freevga/vga/portidx.htm | 99 + specs/freevga/vga/seqpack.gif | Bin 0 -> 5091 bytes specs/freevga/vga/seqpack.txt | 25 + specs/freevga/vga/seqplanr.gif | Bin 0 -> 3932 bytes specs/freevga/vga/seqplanr.txt | 31 + specs/freevga/vga/seqreg.htm | 381 + specs/freevga/vga/textcur.htm | 137 + specs/freevga/vga/vga.htm | 226 + specs/freevga/vga/vgacrtc.htm | 210 + specs/freevga/vga/vgadac.htm | 190 + specs/freevga/vga/vgafunc.htm | 402 + specs/freevga/vga/vgafx.htm | 295 + specs/freevga/vga/vgamem.htm | 334 + specs/freevga/vga/vgareg.htm | 508 ++ specs/freevga/vga/vgargidx.htm | 385 + specs/freevga/vga/vgaseq.htm | 206 + specs/freevga/vga/vgatext.htm | 185 + specs/freevga/vga/virtual.gif | Bin 0 -> 2482 bytes specs/freevga/vga/virtual.txt | 22 + specs/freevga/vtiming.htm | 226 + specs/kbd/abnt-keypad.html | 88 + specs/kbd/amstrad-s.jpg | Bin 0 -> 17613 bytes specs/kbd/amstrad.jpg | Bin 0 -> 49658 bytes specs/kbd/compaq_easy_access.jpg | Bin 0 -> 19073 bytes specs/kbd/compaq_unkn-s.jpg | Bin 0 -> 14585 bytes specs/kbd/compaq_unkn.jpg | Bin 0 -> 40939 bytes specs/kbd/ibm_rapid_access.jpg | Bin 0 -> 25390 bytes specs/kbd/ibm_rapid_access_II.jpg | Bin 0 -> 30870 bytes specs/kbd/imb5576-2.jpg | Bin 0 -> 12375 bytes specs/kbd/jp106-with-scancodes.jpg | Bin 0 -> 83439 bytes specs/kbd/jp106.jpg | Bin 0 -> 109450 bytes specs/kbd/jplaptop.jpg | Bin 0 -> 112866 bytes specs/kbd/lk201-k.gif | Bin 0 -> 17826 bytes specs/kbd/lk411-left.jpg | Bin 0 -> 80003 bytes specs/kbd/lk411-right.jpg | Bin 0 -> 132142 bytes specs/kbd/lk411-s.jpg | Bin 0 -> 13234 bytes specs/kbd/lk411.jpg | Bin 0 -> 41903 bytes specs/kbd/logitech-access.jpg | Bin 0 -> 13710 bytes specs/kbd/logitech-internet-s.jpg | Bin 0 -> 9550 bytes specs/kbd/logitech-internet.jpg | Bin 0 -> 31689 bytes specs/kbd/m24.jpg | Bin 0 -> 128580 bytes specs/kbd/m24kbd.png | Bin 0 -> 22569 bytes specs/kbd/ms_office.jpg | Bin 0 -> 51017 bytes specs/kbd/ncr-s.jpg | Bin 0 -> 15932 bytes specs/kbd/nokia-left.jpg | Bin 0 -> 54651 bytes specs/kbd/nokia-right.jpg | Bin 0 -> 87961 bytes specs/kbd/nokia-s.jpg | Bin 0 -> 17579 bytes specs/kbd/nokia-top.jpg | Bin 0 -> 31532 bytes specs/kbd/nokia.jpg | Bin 0 -> 50388 bytes specs/kbd/samsung-s.jpg | Bin 0 -> 9883 bytes specs/kbd/samsung.jpg | Bin 0 -> 121310 bytes specs/kbd/scancodes-1.html | 418 + specs/kbd/scancodes-10.html | 805 ++ specs/kbd/scancodes-11.html | 280 + specs/kbd/scancodes-12.html | 502 ++ specs/kbd/scancodes-13.html | 79 + specs/kbd/scancodes-14.html | 26 + specs/kbd/scancodes-2.html | 182 + specs/kbd/scancodes-3.html | 64 + specs/kbd/scancodes-4.html | 41 + specs/kbd/scancodes-5.html | 1411 ++++ specs/kbd/scancodes-6.html | 304 + specs/kbd/scancodes-7.html | 164 + specs/kbd/scancodes-8.html | 75 + specs/kbd/scancodes-9.html | 403 + specs/kbd/scancodes.html | 175 + specs/kbd/sk2500.jpg | Bin 0 -> 10202 bytes specs/kbd/table.h | 170 + specs/kbd/telerate-s.jpg | Bin 0 -> 24658 bytes specs/kbd/telerate.jpg | Bin 0 -> 71406 bytes specs/kbd/victor-s.jpg | Bin 0 -> 18071 bytes specs/kbd/victor.jpg | Bin 0 -> 152253 bytes specs/kbd/xt-at-switch.jpg | Bin 0 -> 4611 bytes specs/kbd/xtkbd-s.jpg | Bin 0 -> 15894 bytes specs/kbd/xtkbd.jpg | Bin 0 -> 45613 bytes specs/kbd/yahoo912.jpg | Bin 0 -> 29211 bytes specs/sysv-abi-update.html/ch4.eheader.html | 1184 +++ specs/sysv-abi-update.html/ch4.intro.html | 252 + specs/sysv-abi-update.html/ch4.reloc.html | 180 + specs/sysv-abi-update.html/ch4.sheader.html | 1307 +++ specs/sysv-abi-update.html/ch4.strtab.html | 124 + specs/sysv-abi-update.html/ch4.symtab.html | 592 ++ specs/sysv-abi-update.html/ch5.dynamic.html | 1250 +++ specs/sysv-abi-update.html/ch5.intro.html | 60 + specs/sysv-abi-update.html/ch5.pheader.html | 680 ++ .../ch5.prog_loading.html | 16 + specs/sysv-abi-update.html/contents.gif | Bin 0 -> 223 bytes specs/sysv-abi-update.html/contents.html | 98 + specs/sysv-abi-update.html/init_example.gif | Bin 0 -> 3414 bytes specs/sysv-abi-update.html/next.gif | Bin 0 -> 173 bytes specs/sysv-abi-update.html/previous.gif | Bin 0 -> 216 bytes specs/sysv-abi-update.html/revision.html | 200 + specs/sysv-abi-update.html/warning.gif | Bin 0 -> 232 bytes src/.gitignore | 4 + src/LICENSE | 95 + src/Make.config | 68 + src/Makefile | 29 + src/Makefile.build | 110 + src/Makefile.kernel | 20 + src/Makefile.userprog | 52 + src/devices/.gitignore | 3 + src/devices/Make.vars | 7 + src/devices/Makefile | 1 + src/devices/block.c | 223 + src/devices/block.h | 74 + src/devices/ide.c | 527 ++ src/devices/ide.h | 6 + src/devices/input.c | 52 + src/devices/input.h | 12 + src/devices/intq.c | 114 + src/devices/intq.h | 43 + src/devices/kbd.c | 213 + src/devices/kbd.h | 9 + src/devices/partition.c | 324 + src/devices/partition.h | 8 + src/devices/pit.c | 83 + src/devices/pit.h | 8 + src/devices/rtc.c | 112 + src/devices/rtc.h | 8 + src/devices/serial.c | 228 + src/devices/serial.h | 11 + src/devices/shutdown.c | 133 + src/devices/shutdown.h | 19 + src/devices/speaker.c | 68 + src/devices/speaker.h | 8 + src/devices/swap.c | 82 + src/devices/swap.h | 11 + src/devices/timer.c | 246 + src/devices/timer.h | 29 + src/devices/vga.c | 172 + src/devices/vga.h | 6 + src/examples/.gitignore | 19 + src/examples/Makefile | 29 + src/examples/bubsort.c | 38 + src/examples/cat.c | 34 + src/examples/cmp.c | 68 + src/examples/cp.c | 55 + src/examples/echo.c | 14 + src/examples/halt.c | 14 + src/examples/hex-dump.c | 35 + src/examples/insult.c | 369 + src/examples/lib/.gitignore | 1 + src/examples/lib/user/.dummy | 0 src/examples/lib/user/.gitignore | 1 + src/examples/lineup.c | 46 + src/examples/matmult.c | 57 + src/examples/mcat.c | 45 + src/examples/mcp.c | 68 + src/examples/recursor.c | 34 + src/examples/rm.c | 21 + src/filesys/.gitignore | 3 + src/filesys/Make.vars | 13 + src/filesys/Makefile | 1 + src/filesys/directory.c | 236 + src/filesys/directory.h | 30 + src/filesys/file.c | 187 + src/filesys/file.h | 34 + src/filesys/filesys.c | 103 + src/filesys/filesys.h | 20 + src/filesys/free-map.c | 85 + src/filesys/free-map.h | 17 + src/filesys/fsutil.c | 222 + src/filesys/fsutil.h | 10 + src/filesys/inode.c | 345 + src/filesys/inode.h | 23 + src/filesys/off_t.h | 15 + src/lib/arithmetic.c | 189 + src/lib/ctype.h | 28 + src/lib/debug.c | 32 + src/lib/debug.h | 39 + src/lib/inttypes.h | 48 + src/lib/kernel/bitmap.c | 372 + src/lib/kernel/bitmap.h | 51 + src/lib/kernel/console.c | 191 + src/lib/kernel/console.h | 8 + src/lib/kernel/debug.c | 123 + src/lib/kernel/hash.c | 437 ++ src/lib/kernel/hash.h | 104 + src/lib/kernel/list.c | 524 ++ src/lib/kernel/list.h | 181 + src/lib/kernel/stdio.h | 6 + src/lib/limits.h | 34 + src/lib/packed.h | 10 + src/lib/random.c | 83 + src/lib/random.h | 10 + src/lib/round.h | 18 + src/lib/stdarg.h | 14 + src/lib/stdbool.h | 9 + src/lib/stddef.h | 12 + src/lib/stdint.h | 51 + src/lib/stdio.c | 655 ++ src/lib/stdio.h | 40 + src/lib/stdlib.c | 208 + src/lib/stdlib.h | 22 + src/lib/string.c | 375 + src/lib/string.h | 35 + src/lib/syscall-nr.h | 34 + src/lib/user/console.c | 94 + src/lib/user/debug.c | 25 + src/lib/user/entry.c | 10 + src/lib/user/stdio.h | 7 + src/lib/user/syscall.c | 184 + src/lib/user/syscall.h | 48 + src/lib/user/user.lds | 57 + src/lib/ustar.c | 228 + src/lib/ustar.h | 29 + src/loader.ld | 10 + src/misc/gdb-macros | 175 + src/tests/Algorithm/Diff.pm | 1713 ++++ src/tests/Make.tests | 75 + src/tests/arc4.c | 53 + src/tests/arc4.h | 17 + src/tests/arc4.pm | 29 + src/tests/cksum.c | 92 + src/tests/cksum.h | 8 + src/tests/cksum.pm | 87 + src/tests/devices/Grading | 4 + src/tests/devices/Make.tests | 48 + src/tests/devices/Rubric.alarmfunc | 4 + src/tests/devices/Rubric.alarmrobust | 5 + src/tests/devices/alarm-multiple.ck | 4 + src/tests/devices/alarm-negative.c | 15 + src/tests/devices/alarm-negative.ck | 10 + src/tests/devices/alarm-no-busy-wait.c | 131 + src/tests/devices/alarm-no-busy-wait.ck | 15 + src/tests/devices/alarm-one.c | 18 + src/tests/devices/alarm-one.ck | 10 + src/tests/devices/alarm-simultaneous.c | 94 + src/tests/devices/alarm-simultaneous.ck | 27 + src/tests/devices/alarm-single.ck | 4 + src/tests/devices/alarm-wait.c | 152 + src/tests/devices/alarm-zero.c | 15 + src/tests/devices/alarm-zero.ck | 10 + src/tests/devices/alarm.pm | 32 + src/tests/devices/tests.c | 117 + src/tests/devices/tests.h | 47 + src/tests/filesys/Grading.no-vm | 18 + src/tests/filesys/Grading.with-vm | 22 + src/tests/filesys/base/Make.tests | 18 + src/tests/filesys/base/Rubric | 19 + src/tests/filesys/base/child-syn-read.c | 44 + src/tests/filesys/base/child-syn-wrt.c | 35 + src/tests/filesys/base/full.inc | 20 + src/tests/filesys/base/lg-create.c | 5 + src/tests/filesys/base/lg-create.ck | 13 + src/tests/filesys/base/lg-full.c | 6 + src/tests/filesys/base/lg-full.ck | 16 + src/tests/filesys/base/lg-random.c | 7 + src/tests/filesys/base/lg-random.ck | 14 + src/tests/filesys/base/lg-seq-block.c | 7 + src/tests/filesys/base/lg-seq-block.ck | 16 + src/tests/filesys/base/lg-seq-random.c | 6 + src/tests/filesys/base/lg-seq-random.ck | 16 + src/tests/filesys/base/random.inc | 59 + src/tests/filesys/base/seq-block.inc | 20 + src/tests/filesys/base/seq-random.inc | 22 + src/tests/filesys/base/sm-create.c | 5 + src/tests/filesys/base/sm-create.ck | 13 + src/tests/filesys/base/sm-full.c | 6 + src/tests/filesys/base/sm-full.ck | 16 + src/tests/filesys/base/sm-random.c | 7 + src/tests/filesys/base/sm-random.ck | 14 + src/tests/filesys/base/sm-seq-block.c | 7 + src/tests/filesys/base/sm-seq-block.ck | 16 + src/tests/filesys/base/sm-seq-random.c | 6 + src/tests/filesys/base/sm-seq-random.ck | 16 + src/tests/filesys/base/syn-read.c | 31 + src/tests/filesys/base/syn-read.ck | 33 + src/tests/filesys/base/syn-read.h | 7 + src/tests/filesys/base/syn-remove.c | 30 + src/tests/filesys/base/syn-remove.ck | 16 + src/tests/filesys/base/syn-write.c | 31 + src/tests/filesys/base/syn-write.ck | 32 + src/tests/filesys/base/syn-write.h | 9 + src/tests/filesys/create.inc | 15 + src/tests/filesys/seq-test.c | 37 + src/tests/filesys/seq-test.h | 11 + src/tests/internal/list.c | 174 + src/tests/internal/stdio.c | 208 + src/tests/internal/stdlib.c | 114 + src/tests/lib.c | 196 + src/tests/lib.h | 50 + src/tests/lib.pm | 19 + src/tests/main.c | 15 + src/tests/main.h | 6 + src/tests/make-grade | 152 + src/tests/random.pm | 27 + src/tests/tests.pm | 650 ++ src/tests/threads/Grading | 7 + src/tests/threads/Make.tests | 49 + src/tests/threads/Rubric.mlfqs | 14 + src/tests/threads/Rubric.priority | 16 + src/tests/threads/Rubric.priorityCR | 2 + src/tests/threads/alarm-priority.c | 58 + src/tests/threads/alarm-priority.ck | 19 + src/tests/threads/mlfqs-block.c | 64 + src/tests/threads/mlfqs-block.ck | 17 + src/tests/threads/mlfqs-fair-2.ck | 7 + src/tests/threads/mlfqs-fair-20.ck | 7 + src/tests/threads/mlfqs-fair.c | 124 + src/tests/threads/mlfqs-load-1.c | 60 + src/tests/threads/mlfqs-load-1.ck | 15 + src/tests/threads/mlfqs-load-60.c | 160 + src/tests/threads/mlfqs-load-60.ck | 36 + src/tests/threads/mlfqs-load-avg.c | 167 + src/tests/threads/mlfqs-load-avg.ck | 36 + src/tests/threads/mlfqs-nice-10.ck | 7 + src/tests/threads/mlfqs-nice-2.ck | 7 + src/tests/threads/mlfqs-recent-1.c | 144 + src/tests/threads/mlfqs-recent-1.ck | 31 + src/tests/threads/mlfqs.pm | 146 + src/tests/threads/priority-change.c | 31 + src/tests/threads/priority-change.ck | 14 + src/tests/threads/priority-condvar.c | 53 + src/tests/threads/priority-condvar.ck | 39 + src/tests/threads/priority-donate-chain.c | 114 + src/tests/threads/priority-donate-chain.ck | 46 + src/tests/threads/priority-donate-lower.c | 51 + src/tests/threads/priority-donate-lower.ck | 16 + src/tests/threads/priority-donate-multiple.c | 77 + src/tests/threads/priority-donate-multiple.ck | 19 + src/tests/threads/priority-donate-multiple2.c | 90 + .../threads/priority-donate-multiple2.ck | 19 + src/tests/threads/priority-donate-nest.c | 94 + src/tests/threads/priority-donate-nest.ck | 19 + src/tests/threads/priority-donate-one.c | 65 + src/tests/threads/priority-donate-one.ck | 17 + src/tests/threads/priority-donate-sema.c | 82 + src/tests/threads/priority-donate-sema.ck | 16 + src/tests/threads/priority-fifo.c | 99 + src/tests/threads/priority-fifo.ck | 63 + src/tests/threads/priority-preempt.c | 41 + src/tests/threads/priority-preempt.ck | 16 + src/tests/threads/priority-preservation.c | 84 + src/tests/threads/priority-preservation.ck | 28 + src/tests/threads/priority-sema.c | 45 + src/tests/threads/priority-sema.ck | 29 + src/tests/threads/tests.c | 4 + src/tests/threads/tests.h | 13 + src/tests/userprog/Grading | 11 + src/tests/userprog/Make.tests | 148 + src/tests/userprog/Rubric.functionality | 55 + src/tests/userprog/Rubric.robustness | 50 + src/tests/userprog/Rubric.robustnessCR | 5 + src/tests/userprog/args-dbl-space.ck | 15 + src/tests/userprog/args-many.ck | 35 + src/tests/userprog/args-multiple.ck | 17 + src/tests/userprog/args-none.ck | 13 + src/tests/userprog/args-single.ck | 14 + src/tests/userprog/args.c | 25 + src/tests/userprog/bad-jump.c | 13 + src/tests/userprog/bad-jump.ck | 9 + src/tests/userprog/bad-jump2.c | 13 + src/tests/userprog/bad-jump2.ck | 9 + src/tests/userprog/bad-maths.c | 12 + src/tests/userprog/bad-maths.ck | 9 + src/tests/userprog/bad-read.c | 13 + src/tests/userprog/bad-read.ck | 9 + src/tests/userprog/bad-read2.c | 13 + src/tests/userprog/bad-read2.ck | 9 + src/tests/userprog/bad-write.c | 12 + src/tests/userprog/bad-write.ck | 9 + src/tests/userprog/bad-write2.c | 12 + src/tests/userprog/bad-write2.ck | 9 + src/tests/userprog/boundary.c | 33 + src/tests/userprog/boundary.h | 7 + src/tests/userprog/child-bad.c | 14 + src/tests/userprog/child-close.c | 28 + src/tests/userprog/child-rox.c | 55 + src/tests/userprog/child-simple.c | 15 + src/tests/userprog/close-bad-fd.c | 11 + src/tests/userprog/close-bad-fd.ck | 13 + src/tests/userprog/close-normal.c | 14 + src/tests/userprog/close-normal.ck | 12 + src/tests/userprog/close-stdin.c | 11 + src/tests/userprog/close-stdin.ck | 13 + src/tests/userprog/close-stdout.c | 11 + src/tests/userprog/close-stdout.ck | 13 + src/tests/userprog/close-twice.c | 18 + src/tests/userprog/close-twice.ck | 19 + src/tests/userprog/create-bad-ptr.c | 12 + src/tests/userprog/create-bad-ptr.ck | 9 + src/tests/userprog/create-bound.c | 14 + src/tests/userprog/create-bound.ck | 11 + src/tests/userprog/create-empty.c | 10 + src/tests/userprog/create-empty.ck | 14 + src/tests/userprog/create-exists.c | 16 + src/tests/userprog/create-exists.ck | 15 + src/tests/userprog/create-long.c | 17 + src/tests/userprog/create-long.ck | 11 + src/tests/userprog/create-normal.c | 10 + src/tests/userprog/create-normal.ck | 11 + src/tests/userprog/create-null.c | 11 + src/tests/userprog/create-null.ck | 9 + src/tests/userprog/exec-arg.c | 10 + src/tests/userprog/exec-arg.ck | 17 + src/tests/userprog/exec-bad-ptr.c | 11 + src/tests/userprog/exec-bad-ptr.ck | 13 + src/tests/userprog/exec-exit.c | 13 + src/tests/userprog/exec-large-arg.c | 10 + src/tests/userprog/exec-large-arg.ck | 17 + src/tests/userprog/exec-missing.c | 12 + src/tests/userprog/exec-missing.ck | 31 + src/tests/userprog/exec-multiple.c | 14 + src/tests/userprog/exec-multiple.ck | 18 + src/tests/userprog/exec-once.c | 11 + src/tests/userprog/exec-once.ck | 12 + src/tests/userprog/exec-over-arg.c | 12 + src/tests/userprog/exec-over-arg.ck | 28 + src/tests/userprog/exec-over-args.c | 12 + src/tests/userprog/exec-over-args.ck | 1028 +++ src/tests/userprog/exit.c | 11 + src/tests/userprog/exit.ck | 9 + src/tests/userprog/halt.c | 11 + src/tests/userprog/halt.ck | 15 + src/tests/userprog/lib/.gitignore | 1 + src/tests/userprog/lib/user/.dummy | 0 src/tests/userprog/lib/user/.gitignore | 1 + src/tests/userprog/multi-child-fd.c | 25 + src/tests/userprog/multi-child-fd.ck | 25 + src/tests/userprog/multi-recurse.c | 34 + src/tests/userprog/multi-recurse.ck | 70 + src/tests/userprog/no-vm/Make.tests | 8 + src/tests/userprog/no-vm/Rubric | 3 + src/tests/userprog/no-vm/multi-oom.c | 181 + src/tests/userprog/no-vm/multi-oom.ck | 10 + src/tests/userprog/null.ck | 8 + src/tests/userprog/open-bad-ptr.c | 13 + src/tests/userprog/open-bad-ptr.ck | 13 + src/tests/userprog/open-boundary.c | 14 + src/tests/userprog/open-boundary.ck | 11 + src/tests/userprog/open-empty.c | 13 + src/tests/userprog/open-empty.ck | 10 + src/tests/userprog/open-missing.c | 13 + src/tests/userprog/open-missing.ck | 10 + src/tests/userprog/open-normal.c | 13 + src/tests/userprog/open-normal.ck | 10 + src/tests/userprog/open-null.c | 12 + src/tests/userprog/open-null.ck | 13 + src/tests/userprog/open-twice.c | 19 + src/tests/userprog/open-twice.ck | 12 + src/tests/userprog/read-bad-fd.c | 21 + src/tests/userprog/read-bad-fd.ck | 13 + src/tests/userprog/read-bad-ptr.c | 16 + src/tests/userprog/read-bad-ptr.ck | 15 + src/tests/userprog/read-boundary.c | 30 + src/tests/userprog/read-boundary.ck | 11 + src/tests/userprog/read-normal.c | 11 + src/tests/userprog/read-normal.ck | 13 + src/tests/userprog/read-stdout.c | 14 + src/tests/userprog/read-stdout.ck | 13 + src/tests/userprog/read-zero.c | 22 + src/tests/userprog/read-zero.ck | 11 + src/tests/userprog/rox-child.c | 5 + src/tests/userprog/rox-child.ck | 20 + src/tests/userprog/rox-child.inc | 33 + src/tests/userprog/rox-multichild.c | 5 + src/tests/userprog/rox-multichild.ck | 44 + src/tests/userprog/rox-simple.c | 18 + src/tests/userprog/rox-simple.ck | 13 + src/tests/userprog/sample.inc | 6 + src/tests/userprog/sample.txt | 4 + src/tests/userprog/sc-bad-arg.c | 17 + src/tests/userprog/sc-bad-arg.ck | 9 + src/tests/userprog/sc-bad-num.c | 23 + src/tests/userprog/sc-bad-num.ck | 14 + src/tests/userprog/sc-bad-sp.c | 18 + src/tests/userprog/sc-bad-sp.ck | 9 + src/tests/userprog/sc-boundary-2.c | 22 + src/tests/userprog/sc-boundary-2.ck | 9 + src/tests/userprog/sc-boundary.c | 22 + src/tests/userprog/sc-boundary.ck | 9 + src/tests/userprog/wait-bad-child.c | 14 + src/tests/userprog/wait-bad-child.ck | 40 + src/tests/userprog/wait-bad-pid.c | 14 + src/tests/userprog/wait-bad-pid.ck | 13 + src/tests/userprog/wait-killed.c | 11 + src/tests/userprog/wait-killed.ck | 13 + src/tests/userprog/wait-load-kill.c | 16 + src/tests/userprog/wait-load-kill.ck | 30 + src/tests/userprog/wait-simple.c | 11 + src/tests/userprog/wait-simple.ck | 13 + src/tests/userprog/wait-twice.c | 15 + src/tests/userprog/wait-twice.ck | 14 + src/tests/userprog/write-bad-fd.c | 20 + src/tests/userprog/write-bad-fd.ck | 13 + src/tests/userprog/write-bad-ptr.c | 16 + src/tests/userprog/write-bad-ptr.ck | 15 + src/tests/userprog/write-boundary.c | 25 + src/tests/userprog/write-boundary.ck | 11 + src/tests/userprog/write-normal.c | 20 + src/tests/userprog/write-normal.ck | 12 + src/tests/userprog/write-stdin.c | 14 + src/tests/userprog/write-stdin.ck | 13 + src/tests/userprog/write-zero.c | 20 + src/tests/userprog/write-zero.ck | 11 + src/tests/vm/Grading | 12 + src/tests/vm/Make.tests | 105 + src/tests/vm/Rubric.functionality | 30 + src/tests/vm/Rubric.robustness | 22 + src/tests/vm/child-inherit.c | 16 + src/tests/vm/child-linear.c | 36 + src/tests/vm/child-mm-wrt.c | 24 + src/tests/vm/child-qsort-mm.c | 25 + src/tests/vm/child-qsort.c | 32 + src/tests/vm/child-sort.c | 42 + src/tests/vm/mmap-bad-fd.c | 15 + src/tests/vm/mmap-bad-fd.ck | 15 + src/tests/vm/mmap-clean.c | 53 + src/tests/vm/mmap-clean.ck | 16 + src/tests/vm/mmap-close.c | 27 + src/tests/vm/mmap-close.ck | 11 + src/tests/vm/mmap-exit.c | 22 + src/tests/vm/mmap-exit.ck | 17 + src/tests/vm/mmap-inherit.c | 32 + src/tests/vm/mmap-inherit.ck | 16 + src/tests/vm/mmap-misalign.c | 16 + src/tests/vm/mmap-misalign.ck | 11 + src/tests/vm/mmap-null.c | 15 + src/tests/vm/mmap-null.ck | 11 + src/tests/vm/mmap-over-code.c | 19 + src/tests/vm/mmap-over-code.ck | 11 + src/tests/vm/mmap-over-data.c | 21 + src/tests/vm/mmap-over-data.ck | 11 + src/tests/vm/mmap-over-stk.c | 19 + src/tests/vm/mmap-over-stk.ck | 11 + src/tests/vm/mmap-overlap.c | 20 + src/tests/vm/mmap-overlap.ck | 13 + src/tests/vm/mmap-read.c | 32 + src/tests/vm/mmap-read.ck | 11 + src/tests/vm/mmap-remove.c | 43 + src/tests/vm/mmap-remove.ck | 14 + src/tests/vm/mmap-shuffle.c | 38 + src/tests/vm/mmap-shuffle.ck | 47 + src/tests/vm/mmap-twice.c | 28 + src/tests/vm/mmap-twice.ck | 15 + src/tests/vm/mmap-unmap.c | 23 + src/tests/vm/mmap-unmap.ck | 7 + src/tests/vm/mmap-write.c | 32 + src/tests/vm/mmap-write.ck | 13 + src/tests/vm/mmap-zero.c | 27 + src/tests/vm/mmap-zero.ck | 12 + src/tests/vm/page-linear.c | 44 + src/tests/vm/page-linear.ck | 14 + src/tests/vm/page-merge-mm.c | 8 + src/tests/vm/page-merge-mm.ck | 29 + src/tests/vm/page-merge-par.c | 8 + src/tests/vm/page-merge-par.ck | 29 + src/tests/vm/page-merge-seq.c | 137 + src/tests/vm/page-merge-seq.ck | 29 + src/tests/vm/page-merge-stk.c | 8 + src/tests/vm/page-merge-stk.ck | 29 + src/tests/vm/page-parallel.c | 21 + src/tests/vm/page-parallel.ck | 17 + src/tests/vm/page-shuffle.c | 30 + src/tests/vm/page-shuffle.ck | 44 + src/tests/vm/parallel-merge.c | 149 + src/tests/vm/parallel-merge.h | 6 + src/tests/vm/process_death.pm | 22 + src/tests/vm/pt-bad-addr.c | 11 + src/tests/vm/pt-bad-addr.ck | 7 + src/tests/vm/pt-bad-read.c | 16 + src/tests/vm/pt-bad-read.ck | 10 + src/tests/vm/pt-big-stk-obj.c | 20 + src/tests/vm/pt-big-stk-obj.ck | 10 + src/tests/vm/pt-grow-bad.c | 14 + src/tests/vm/pt-grow-bad.ck | 9 + src/tests/vm/pt-grow-pusha.c | 20 + src/tests/vm/pt-grow-pusha.ck | 9 + src/tests/vm/pt-grow-stack.c | 20 + src/tests/vm/pt-grow-stack.ck | 10 + src/tests/vm/pt-grow-stk-sc.c | 32 + src/tests/vm/pt-grow-stk-sc.ck | 15 + src/tests/vm/pt-overflowstk.c | 58 + src/tests/vm/pt-overflowstk.ck | 39 + src/tests/vm/pt-write-code-2.c | 15 + src/tests/vm/pt-write-code.c | 12 + src/tests/vm/pt-write-code.ck | 7 + src/tests/vm/pt-write-code2.ck | 10 + src/tests/vm/qsort.c | 136 + src/tests/vm/qsort.h | 8 + src/tests/vm/sample.inc | 19 + src/tests/vm/sample.txt | 17 + src/threads/.gitignore | 3 + src/threads/Make.vars | 7 + src/threads/Makefile | 1 + src/threads/flags.h | 8 + src/threads/init.c | 437 ++ src/threads/init.h | 12 + src/threads/interrupt.c | 438 ++ src/threads/interrupt.h | 70 + src/threads/intr-stubs.S | 203 + src/threads/intr-stubs.h | 19 + src/threads/io.h | 115 + src/threads/kernel.lds.S | 30 + src/threads/loader.S | 263 + src/threads/loader.h | 40 + src/threads/malloc.c | 294 + src/threads/malloc.h | 13 + src/threads/palloc.c | 182 + src/threads/palloc.h | 20 + src/threads/pte.h | 107 + src/threads/start.S | 204 + src/threads/switch.S | 65 + src/threads/switch.h | 39 + src/threads/synch.c | 338 + src/threads/synch.h | 51 + src/threads/thread.c | 603 ++ src/threads/thread.h | 142 + src/threads/vaddr.h | 89 + src/userprog/.gitignore | 3 + src/userprog/Make.vars | 7 + src/userprog/Makefile | 1 + src/userprog/exception.c | 158 + src/userprog/exception.h | 12 + src/userprog/gdt.c | 146 + src/userprog/gdt.h | 15 + src/userprog/pagedir.c | 290 + src/userprog/pagedir.h | 20 + src/userprog/process.c | 479 ++ src/userprog/process.h | 11 + src/userprog/syscall.c | 20 + src/userprog/syscall.h | 6 + src/userprog/tss.c | 106 + src/userprog/tss.h | 11 + src/utils/.gitignore | 3 + src/utils/Makefile | 11 + src/utils/Pintos.pm | 491 ++ src/utils/backtrace | 106 + src/utils/pintos | 947 +++ src/utils/pintos-gdb | 28 + src/utils/pintos-mkdisk | 134 + src/utils/pintos-set-cmdline | 42 + src/utils/setitimer-helper.c | 49 + src/utils/squish-pty.c | 345 + src/utils/squish-unix.c | 337 + src/vm/.gitignore | 3 + src/vm/Make.vars | 7 + src/vm/Makefile | 1 + tests/.gitignore | 11 + tests/Makefile | 67 + 697 files changed, 74252 insertions(+) create mode 100644 .gitignore create mode 100644 AUTHORS create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 doc/.gitignore create mode 100644 doc/44bsd.texi create mode 100644 doc/Makefile create mode 100644 doc/alarmclock.tex create mode 100644 doc/bibliography.texi create mode 100644 doc/codebase.texi create mode 100644 doc/debug.texi create mode 100644 doc/devel.texi create mode 100644 doc/devices.tmpl create mode 100644 doc/doc.texi create mode 100644 doc/installation.texi create mode 100644 doc/intro.texi create mode 100644 doc/license.texi create mode 100644 doc/localgitinstructions.texi create mode 100644 doc/localsettings.texi create mode 100644 doc/pintos-ic.texi create mode 100644 doc/pintos-t2h.init create mode 100644 doc/pintos.css create mode 100644 doc/reference.texi create mode 100644 doc/sample.tmpl create mode 100644 doc/standards.texi create mode 100644 doc/task0_questions.texi create mode 100644 doc/task0_sheet.texi create mode 100755 doc/texi2html create mode 100644 doc/texinfo.tex create mode 100644 doc/threads.texi create mode 100644 doc/threads.tmpl create mode 100644 doc/userprog.texi create mode 100644 doc/userprog.tmpl create mode 100644 doc/vm.texi create mode 100644 doc/vm.tmpl create mode 100644 specs/freevga/feedback.htm create mode 100644 specs/freevga/freevga.htm create mode 100644 specs/freevga/glossary.htm create mode 100644 specs/freevga/hardovr.htm create mode 100644 specs/freevga/hardrec.htm create mode 100644 specs/freevga/home.htm create mode 100644 specs/freevga/license.htm create mode 100644 specs/freevga/llintro.htm create mode 100644 specs/freevga/vga/256left.gif create mode 100644 specs/freevga/vga/256left.txt create mode 100644 specs/freevga/vga/256right.gif create mode 100644 specs/freevga/vga/256right.txt create mode 100644 specs/freevga/vga/attrreg.htm create mode 100644 specs/freevga/vga/char.txt create mode 100644 specs/freevga/vga/colorreg.htm create mode 100644 specs/freevga/vga/crtcreg.htm create mode 100644 specs/freevga/vga/extreg.htm create mode 100644 specs/freevga/vga/graphreg.htm create mode 100644 specs/freevga/vga/license.htm create mode 100644 specs/freevga/vga/paging.gif create mode 100644 specs/freevga/vga/paging.txt create mode 100644 specs/freevga/vga/portidx.htm create mode 100644 specs/freevga/vga/seqpack.gif create mode 100644 specs/freevga/vga/seqpack.txt create mode 100644 specs/freevga/vga/seqplanr.gif create mode 100644 specs/freevga/vga/seqplanr.txt create mode 100644 specs/freevga/vga/seqreg.htm create mode 100644 specs/freevga/vga/textcur.htm create mode 100644 specs/freevga/vga/vga.htm create mode 100644 specs/freevga/vga/vgacrtc.htm create mode 100644 specs/freevga/vga/vgadac.htm create mode 100644 specs/freevga/vga/vgafunc.htm create mode 100644 specs/freevga/vga/vgafx.htm create mode 100644 specs/freevga/vga/vgamem.htm create mode 100644 specs/freevga/vga/vgareg.htm create mode 100644 specs/freevga/vga/vgargidx.htm create mode 100644 specs/freevga/vga/vgaseq.htm create mode 100644 specs/freevga/vga/vgatext.htm create mode 100644 specs/freevga/vga/virtual.gif create mode 100644 specs/freevga/vga/virtual.txt create mode 100644 specs/freevga/vtiming.htm create mode 100644 specs/kbd/abnt-keypad.html create mode 100644 specs/kbd/amstrad-s.jpg create mode 100644 specs/kbd/amstrad.jpg create mode 100644 specs/kbd/compaq_easy_access.jpg create mode 100644 specs/kbd/compaq_unkn-s.jpg create mode 100644 specs/kbd/compaq_unkn.jpg create mode 100644 specs/kbd/ibm_rapid_access.jpg create mode 100644 specs/kbd/ibm_rapid_access_II.jpg create mode 100644 specs/kbd/imb5576-2.jpg create mode 100644 specs/kbd/jp106-with-scancodes.jpg create mode 100644 specs/kbd/jp106.jpg create mode 100644 specs/kbd/jplaptop.jpg create mode 100644 specs/kbd/lk201-k.gif create mode 100644 specs/kbd/lk411-left.jpg create mode 100644 specs/kbd/lk411-right.jpg create mode 100644 specs/kbd/lk411-s.jpg create mode 100644 specs/kbd/lk411.jpg create mode 100644 specs/kbd/logitech-access.jpg create mode 100644 specs/kbd/logitech-internet-s.jpg create mode 100644 specs/kbd/logitech-internet.jpg create mode 100644 specs/kbd/m24.jpg create mode 100644 specs/kbd/m24kbd.png create mode 100644 specs/kbd/ms_office.jpg create mode 100644 specs/kbd/ncr-s.jpg create mode 100644 specs/kbd/nokia-left.jpg create mode 100644 specs/kbd/nokia-right.jpg create mode 100644 specs/kbd/nokia-s.jpg create mode 100644 specs/kbd/nokia-top.jpg create mode 100644 specs/kbd/nokia.jpg create mode 100644 specs/kbd/samsung-s.jpg create mode 100644 specs/kbd/samsung.jpg create mode 100644 specs/kbd/scancodes-1.html create mode 100644 specs/kbd/scancodes-10.html create mode 100644 specs/kbd/scancodes-11.html create mode 100644 specs/kbd/scancodes-12.html create mode 100644 specs/kbd/scancodes-13.html create mode 100644 specs/kbd/scancodes-14.html create mode 100644 specs/kbd/scancodes-2.html create mode 100644 specs/kbd/scancodes-3.html create mode 100644 specs/kbd/scancodes-4.html create mode 100644 specs/kbd/scancodes-5.html create mode 100644 specs/kbd/scancodes-6.html create mode 100644 specs/kbd/scancodes-7.html create mode 100644 specs/kbd/scancodes-8.html create mode 100644 specs/kbd/scancodes-9.html create mode 100644 specs/kbd/scancodes.html create mode 100644 specs/kbd/sk2500.jpg create mode 100644 specs/kbd/table.h create mode 100644 specs/kbd/telerate-s.jpg create mode 100644 specs/kbd/telerate.jpg create mode 100644 specs/kbd/victor-s.jpg create mode 100644 specs/kbd/victor.jpg create mode 100644 specs/kbd/xt-at-switch.jpg create mode 100644 specs/kbd/xtkbd-s.jpg create mode 100644 specs/kbd/xtkbd.jpg create mode 100644 specs/kbd/yahoo912.jpg create mode 100644 specs/sysv-abi-update.html/ch4.eheader.html create mode 100644 specs/sysv-abi-update.html/ch4.intro.html create mode 100644 specs/sysv-abi-update.html/ch4.reloc.html create mode 100644 specs/sysv-abi-update.html/ch4.sheader.html create mode 100644 specs/sysv-abi-update.html/ch4.strtab.html create mode 100644 specs/sysv-abi-update.html/ch4.symtab.html create mode 100644 specs/sysv-abi-update.html/ch5.dynamic.html create mode 100644 specs/sysv-abi-update.html/ch5.intro.html create mode 100644 specs/sysv-abi-update.html/ch5.pheader.html create mode 100644 specs/sysv-abi-update.html/ch5.prog_loading.html create mode 100644 specs/sysv-abi-update.html/contents.gif create mode 100644 specs/sysv-abi-update.html/contents.html create mode 100644 specs/sysv-abi-update.html/init_example.gif create mode 100644 specs/sysv-abi-update.html/next.gif create mode 100644 specs/sysv-abi-update.html/previous.gif create mode 100644 specs/sysv-abi-update.html/revision.html create mode 100644 specs/sysv-abi-update.html/warning.gif create mode 100644 src/.gitignore create mode 100644 src/LICENSE create mode 100644 src/Make.config create mode 100644 src/Makefile create mode 100644 src/Makefile.build create mode 100644 src/Makefile.kernel create mode 100644 src/Makefile.userprog create mode 100644 src/devices/.gitignore create mode 100644 src/devices/Make.vars create mode 100644 src/devices/Makefile create mode 100644 src/devices/block.c create mode 100644 src/devices/block.h create mode 100644 src/devices/ide.c create mode 100644 src/devices/ide.h create mode 100644 src/devices/input.c create mode 100644 src/devices/input.h create mode 100644 src/devices/intq.c create mode 100644 src/devices/intq.h create mode 100644 src/devices/kbd.c create mode 100644 src/devices/kbd.h create mode 100644 src/devices/partition.c create mode 100644 src/devices/partition.h create mode 100644 src/devices/pit.c create mode 100644 src/devices/pit.h create mode 100644 src/devices/rtc.c create mode 100644 src/devices/rtc.h create mode 100644 src/devices/serial.c create mode 100644 src/devices/serial.h create mode 100644 src/devices/shutdown.c create mode 100644 src/devices/shutdown.h create mode 100644 src/devices/speaker.c create mode 100644 src/devices/speaker.h create mode 100644 src/devices/swap.c create mode 100644 src/devices/swap.h create mode 100644 src/devices/timer.c create mode 100644 src/devices/timer.h create mode 100644 src/devices/vga.c create mode 100644 src/devices/vga.h create mode 100644 src/examples/.gitignore create mode 100644 src/examples/Makefile create mode 100644 src/examples/bubsort.c create mode 100644 src/examples/cat.c create mode 100644 src/examples/cmp.c create mode 100644 src/examples/cp.c create mode 100644 src/examples/echo.c create mode 100644 src/examples/halt.c create mode 100644 src/examples/hex-dump.c create mode 100644 src/examples/insult.c create mode 100644 src/examples/lib/.gitignore create mode 100644 src/examples/lib/user/.dummy create mode 100644 src/examples/lib/user/.gitignore create mode 100644 src/examples/lineup.c create mode 100644 src/examples/matmult.c create mode 100644 src/examples/mcat.c create mode 100644 src/examples/mcp.c create mode 100644 src/examples/recursor.c create mode 100644 src/examples/rm.c create mode 100644 src/filesys/.gitignore create mode 100644 src/filesys/Make.vars create mode 100644 src/filesys/Makefile create mode 100644 src/filesys/directory.c create mode 100644 src/filesys/directory.h create mode 100644 src/filesys/file.c create mode 100644 src/filesys/file.h create mode 100644 src/filesys/filesys.c create mode 100644 src/filesys/filesys.h create mode 100644 src/filesys/free-map.c create mode 100644 src/filesys/free-map.h create mode 100644 src/filesys/fsutil.c create mode 100644 src/filesys/fsutil.h create mode 100644 src/filesys/inode.c create mode 100644 src/filesys/inode.h create mode 100644 src/filesys/off_t.h create mode 100644 src/lib/arithmetic.c create mode 100644 src/lib/ctype.h create mode 100644 src/lib/debug.c create mode 100644 src/lib/debug.h create mode 100644 src/lib/inttypes.h create mode 100644 src/lib/kernel/bitmap.c create mode 100644 src/lib/kernel/bitmap.h create mode 100644 src/lib/kernel/console.c create mode 100644 src/lib/kernel/console.h create mode 100644 src/lib/kernel/debug.c create mode 100644 src/lib/kernel/hash.c create mode 100644 src/lib/kernel/hash.h create mode 100644 src/lib/kernel/list.c create mode 100644 src/lib/kernel/list.h create mode 100644 src/lib/kernel/stdio.h create mode 100644 src/lib/limits.h create mode 100644 src/lib/packed.h create mode 100644 src/lib/random.c create mode 100644 src/lib/random.h create mode 100644 src/lib/round.h create mode 100644 src/lib/stdarg.h create mode 100644 src/lib/stdbool.h create mode 100644 src/lib/stddef.h create mode 100644 src/lib/stdint.h create mode 100644 src/lib/stdio.c create mode 100644 src/lib/stdio.h create mode 100644 src/lib/stdlib.c create mode 100644 src/lib/stdlib.h create mode 100644 src/lib/string.c create mode 100644 src/lib/string.h create mode 100644 src/lib/syscall-nr.h create mode 100644 src/lib/user/console.c create mode 100644 src/lib/user/debug.c create mode 100644 src/lib/user/entry.c create mode 100644 src/lib/user/stdio.h create mode 100644 src/lib/user/syscall.c create mode 100644 src/lib/user/syscall.h create mode 100644 src/lib/user/user.lds create mode 100644 src/lib/ustar.c create mode 100644 src/lib/ustar.h create mode 100644 src/loader.ld create mode 100644 src/misc/gdb-macros create mode 100644 src/tests/Algorithm/Diff.pm create mode 100644 src/tests/Make.tests create mode 100644 src/tests/arc4.c create mode 100644 src/tests/arc4.h create mode 100644 src/tests/arc4.pm create mode 100644 src/tests/cksum.c create mode 100644 src/tests/cksum.h create mode 100644 src/tests/cksum.pm create mode 100644 src/tests/devices/Grading create mode 100644 src/tests/devices/Make.tests create mode 100644 src/tests/devices/Rubric.alarmfunc create mode 100644 src/tests/devices/Rubric.alarmrobust create mode 100644 src/tests/devices/alarm-multiple.ck create mode 100644 src/tests/devices/alarm-negative.c create mode 100644 src/tests/devices/alarm-negative.ck create mode 100644 src/tests/devices/alarm-no-busy-wait.c create mode 100644 src/tests/devices/alarm-no-busy-wait.ck create mode 100644 src/tests/devices/alarm-one.c create mode 100644 src/tests/devices/alarm-one.ck create mode 100644 src/tests/devices/alarm-simultaneous.c create mode 100644 src/tests/devices/alarm-simultaneous.ck create mode 100644 src/tests/devices/alarm-single.ck create mode 100644 src/tests/devices/alarm-wait.c create mode 100644 src/tests/devices/alarm-zero.c create mode 100644 src/tests/devices/alarm-zero.ck create mode 100644 src/tests/devices/alarm.pm create mode 100644 src/tests/devices/tests.c create mode 100644 src/tests/devices/tests.h create mode 100644 src/tests/filesys/Grading.no-vm create mode 100644 src/tests/filesys/Grading.with-vm create mode 100644 src/tests/filesys/base/Make.tests create mode 100644 src/tests/filesys/base/Rubric create mode 100644 src/tests/filesys/base/child-syn-read.c create mode 100644 src/tests/filesys/base/child-syn-wrt.c create mode 100644 src/tests/filesys/base/full.inc create mode 100644 src/tests/filesys/base/lg-create.c create mode 100644 src/tests/filesys/base/lg-create.ck create mode 100644 src/tests/filesys/base/lg-full.c create mode 100644 src/tests/filesys/base/lg-full.ck create mode 100644 src/tests/filesys/base/lg-random.c create mode 100644 src/tests/filesys/base/lg-random.ck create mode 100644 src/tests/filesys/base/lg-seq-block.c create mode 100644 src/tests/filesys/base/lg-seq-block.ck create mode 100644 src/tests/filesys/base/lg-seq-random.c create mode 100644 src/tests/filesys/base/lg-seq-random.ck create mode 100644 src/tests/filesys/base/random.inc create mode 100644 src/tests/filesys/base/seq-block.inc create mode 100644 src/tests/filesys/base/seq-random.inc create mode 100644 src/tests/filesys/base/sm-create.c create mode 100644 src/tests/filesys/base/sm-create.ck create mode 100644 src/tests/filesys/base/sm-full.c create mode 100644 src/tests/filesys/base/sm-full.ck create mode 100644 src/tests/filesys/base/sm-random.c create mode 100644 src/tests/filesys/base/sm-random.ck create mode 100644 src/tests/filesys/base/sm-seq-block.c create mode 100644 src/tests/filesys/base/sm-seq-block.ck create mode 100644 src/tests/filesys/base/sm-seq-random.c create mode 100644 src/tests/filesys/base/sm-seq-random.ck create mode 100644 src/tests/filesys/base/syn-read.c create mode 100644 src/tests/filesys/base/syn-read.ck create mode 100644 src/tests/filesys/base/syn-read.h create mode 100644 src/tests/filesys/base/syn-remove.c create mode 100644 src/tests/filesys/base/syn-remove.ck create mode 100644 src/tests/filesys/base/syn-write.c create mode 100644 src/tests/filesys/base/syn-write.ck create mode 100644 src/tests/filesys/base/syn-write.h create mode 100644 src/tests/filesys/create.inc create mode 100644 src/tests/filesys/seq-test.c create mode 100644 src/tests/filesys/seq-test.h create mode 100644 src/tests/internal/list.c create mode 100644 src/tests/internal/stdio.c create mode 100644 src/tests/internal/stdlib.c create mode 100644 src/tests/lib.c create mode 100644 src/tests/lib.h create mode 100644 src/tests/lib.pm create mode 100644 src/tests/main.c create mode 100644 src/tests/main.h create mode 100755 src/tests/make-grade create mode 100644 src/tests/random.pm create mode 100644 src/tests/tests.pm create mode 100644 src/tests/threads/Grading create mode 100644 src/tests/threads/Make.tests create mode 100644 src/tests/threads/Rubric.mlfqs create mode 100644 src/tests/threads/Rubric.priority create mode 100644 src/tests/threads/Rubric.priorityCR create mode 100644 src/tests/threads/alarm-priority.c create mode 100644 src/tests/threads/alarm-priority.ck create mode 100644 src/tests/threads/mlfqs-block.c create mode 100644 src/tests/threads/mlfqs-block.ck create mode 100644 src/tests/threads/mlfqs-fair-2.ck create mode 100644 src/tests/threads/mlfqs-fair-20.ck create mode 100644 src/tests/threads/mlfqs-fair.c create mode 100644 src/tests/threads/mlfqs-load-1.c create mode 100644 src/tests/threads/mlfqs-load-1.ck create mode 100644 src/tests/threads/mlfqs-load-60.c create mode 100644 src/tests/threads/mlfqs-load-60.ck create mode 100644 src/tests/threads/mlfqs-load-avg.c create mode 100644 src/tests/threads/mlfqs-load-avg.ck create mode 100644 src/tests/threads/mlfqs-nice-10.ck create mode 100644 src/tests/threads/mlfqs-nice-2.ck create mode 100644 src/tests/threads/mlfqs-recent-1.c create mode 100644 src/tests/threads/mlfqs-recent-1.ck create mode 100644 src/tests/threads/mlfqs.pm create mode 100644 src/tests/threads/priority-change.c create mode 100644 src/tests/threads/priority-change.ck create mode 100644 src/tests/threads/priority-condvar.c create mode 100644 src/tests/threads/priority-condvar.ck create mode 100644 src/tests/threads/priority-donate-chain.c create mode 100644 src/tests/threads/priority-donate-chain.ck create mode 100644 src/tests/threads/priority-donate-lower.c create mode 100644 src/tests/threads/priority-donate-lower.ck create mode 100644 src/tests/threads/priority-donate-multiple.c create mode 100644 src/tests/threads/priority-donate-multiple.ck create mode 100644 src/tests/threads/priority-donate-multiple2.c create mode 100644 src/tests/threads/priority-donate-multiple2.ck create mode 100644 src/tests/threads/priority-donate-nest.c create mode 100644 src/tests/threads/priority-donate-nest.ck create mode 100644 src/tests/threads/priority-donate-one.c create mode 100644 src/tests/threads/priority-donate-one.ck create mode 100644 src/tests/threads/priority-donate-sema.c create mode 100644 src/tests/threads/priority-donate-sema.ck create mode 100644 src/tests/threads/priority-fifo.c create mode 100644 src/tests/threads/priority-fifo.ck create mode 100644 src/tests/threads/priority-preempt.c create mode 100644 src/tests/threads/priority-preempt.ck create mode 100644 src/tests/threads/priority-preservation.c create mode 100644 src/tests/threads/priority-preservation.ck create mode 100644 src/tests/threads/priority-sema.c create mode 100644 src/tests/threads/priority-sema.ck create mode 100644 src/tests/threads/tests.c create mode 100644 src/tests/threads/tests.h create mode 100644 src/tests/userprog/Grading create mode 100644 src/tests/userprog/Make.tests create mode 100644 src/tests/userprog/Rubric.functionality create mode 100644 src/tests/userprog/Rubric.robustness create mode 100644 src/tests/userprog/Rubric.robustnessCR create mode 100644 src/tests/userprog/args-dbl-space.ck create mode 100644 src/tests/userprog/args-many.ck create mode 100644 src/tests/userprog/args-multiple.ck create mode 100644 src/tests/userprog/args-none.ck create mode 100644 src/tests/userprog/args-single.ck create mode 100644 src/tests/userprog/args.c create mode 100644 src/tests/userprog/bad-jump.c create mode 100644 src/tests/userprog/bad-jump.ck create mode 100644 src/tests/userprog/bad-jump2.c create mode 100644 src/tests/userprog/bad-jump2.ck create mode 100644 src/tests/userprog/bad-maths.c create mode 100644 src/tests/userprog/bad-maths.ck create mode 100644 src/tests/userprog/bad-read.c create mode 100644 src/tests/userprog/bad-read.ck create mode 100644 src/tests/userprog/bad-read2.c create mode 100644 src/tests/userprog/bad-read2.ck create mode 100644 src/tests/userprog/bad-write.c create mode 100644 src/tests/userprog/bad-write.ck create mode 100644 src/tests/userprog/bad-write2.c create mode 100644 src/tests/userprog/bad-write2.ck create mode 100644 src/tests/userprog/boundary.c create mode 100644 src/tests/userprog/boundary.h create mode 100644 src/tests/userprog/child-bad.c create mode 100644 src/tests/userprog/child-close.c create mode 100644 src/tests/userprog/child-rox.c create mode 100644 src/tests/userprog/child-simple.c create mode 100644 src/tests/userprog/close-bad-fd.c create mode 100644 src/tests/userprog/close-bad-fd.ck create mode 100644 src/tests/userprog/close-normal.c create mode 100644 src/tests/userprog/close-normal.ck create mode 100644 src/tests/userprog/close-stdin.c create mode 100644 src/tests/userprog/close-stdin.ck create mode 100644 src/tests/userprog/close-stdout.c create mode 100644 src/tests/userprog/close-stdout.ck create mode 100644 src/tests/userprog/close-twice.c create mode 100644 src/tests/userprog/close-twice.ck create mode 100644 src/tests/userprog/create-bad-ptr.c create mode 100644 src/tests/userprog/create-bad-ptr.ck create mode 100644 src/tests/userprog/create-bound.c create mode 100644 src/tests/userprog/create-bound.ck create mode 100644 src/tests/userprog/create-empty.c create mode 100644 src/tests/userprog/create-empty.ck create mode 100644 src/tests/userprog/create-exists.c create mode 100644 src/tests/userprog/create-exists.ck create mode 100644 src/tests/userprog/create-long.c create mode 100644 src/tests/userprog/create-long.ck create mode 100644 src/tests/userprog/create-normal.c create mode 100644 src/tests/userprog/create-normal.ck create mode 100644 src/tests/userprog/create-null.c create mode 100644 src/tests/userprog/create-null.ck create mode 100644 src/tests/userprog/exec-arg.c create mode 100644 src/tests/userprog/exec-arg.ck create mode 100644 src/tests/userprog/exec-bad-ptr.c create mode 100644 src/tests/userprog/exec-bad-ptr.ck create mode 100644 src/tests/userprog/exec-exit.c create mode 100644 src/tests/userprog/exec-large-arg.c create mode 100644 src/tests/userprog/exec-large-arg.ck create mode 100644 src/tests/userprog/exec-missing.c create mode 100644 src/tests/userprog/exec-missing.ck create mode 100644 src/tests/userprog/exec-multiple.c create mode 100644 src/tests/userprog/exec-multiple.ck create mode 100644 src/tests/userprog/exec-once.c create mode 100644 src/tests/userprog/exec-once.ck create mode 100644 src/tests/userprog/exec-over-arg.c create mode 100644 src/tests/userprog/exec-over-arg.ck create mode 100644 src/tests/userprog/exec-over-args.c create mode 100644 src/tests/userprog/exec-over-args.ck create mode 100644 src/tests/userprog/exit.c create mode 100644 src/tests/userprog/exit.ck create mode 100644 src/tests/userprog/halt.c create mode 100644 src/tests/userprog/halt.ck create mode 100644 src/tests/userprog/lib/.gitignore create mode 100644 src/tests/userprog/lib/user/.dummy create mode 100644 src/tests/userprog/lib/user/.gitignore create mode 100644 src/tests/userprog/multi-child-fd.c create mode 100644 src/tests/userprog/multi-child-fd.ck create mode 100644 src/tests/userprog/multi-recurse.c create mode 100644 src/tests/userprog/multi-recurse.ck create mode 100644 src/tests/userprog/no-vm/Make.tests create mode 100644 src/tests/userprog/no-vm/Rubric create mode 100644 src/tests/userprog/no-vm/multi-oom.c create mode 100644 src/tests/userprog/no-vm/multi-oom.ck create mode 100644 src/tests/userprog/null.ck create mode 100644 src/tests/userprog/open-bad-ptr.c create mode 100644 src/tests/userprog/open-bad-ptr.ck create mode 100644 src/tests/userprog/open-boundary.c create mode 100644 src/tests/userprog/open-boundary.ck create mode 100644 src/tests/userprog/open-empty.c create mode 100644 src/tests/userprog/open-empty.ck create mode 100644 src/tests/userprog/open-missing.c create mode 100644 src/tests/userprog/open-missing.ck create mode 100644 src/tests/userprog/open-normal.c create mode 100644 src/tests/userprog/open-normal.ck create mode 100644 src/tests/userprog/open-null.c create mode 100644 src/tests/userprog/open-null.ck create mode 100644 src/tests/userprog/open-twice.c create mode 100644 src/tests/userprog/open-twice.ck create mode 100644 src/tests/userprog/read-bad-fd.c create mode 100644 src/tests/userprog/read-bad-fd.ck create mode 100644 src/tests/userprog/read-bad-ptr.c create mode 100644 src/tests/userprog/read-bad-ptr.ck create mode 100644 src/tests/userprog/read-boundary.c create mode 100644 src/tests/userprog/read-boundary.ck create mode 100644 src/tests/userprog/read-normal.c create mode 100644 src/tests/userprog/read-normal.ck create mode 100644 src/tests/userprog/read-stdout.c create mode 100644 src/tests/userprog/read-stdout.ck create mode 100644 src/tests/userprog/read-zero.c create mode 100644 src/tests/userprog/read-zero.ck create mode 100644 src/tests/userprog/rox-child.c create mode 100644 src/tests/userprog/rox-child.ck create mode 100644 src/tests/userprog/rox-child.inc create mode 100644 src/tests/userprog/rox-multichild.c create mode 100644 src/tests/userprog/rox-multichild.ck create mode 100644 src/tests/userprog/rox-simple.c create mode 100644 src/tests/userprog/rox-simple.ck create mode 100644 src/tests/userprog/sample.inc create mode 100644 src/tests/userprog/sample.txt create mode 100644 src/tests/userprog/sc-bad-arg.c create mode 100644 src/tests/userprog/sc-bad-arg.ck create mode 100644 src/tests/userprog/sc-bad-num.c create mode 100644 src/tests/userprog/sc-bad-num.ck create mode 100644 src/tests/userprog/sc-bad-sp.c create mode 100644 src/tests/userprog/sc-bad-sp.ck create mode 100644 src/tests/userprog/sc-boundary-2.c create mode 100644 src/tests/userprog/sc-boundary-2.ck create mode 100644 src/tests/userprog/sc-boundary.c create mode 100644 src/tests/userprog/sc-boundary.ck create mode 100644 src/tests/userprog/wait-bad-child.c create mode 100644 src/tests/userprog/wait-bad-child.ck create mode 100644 src/tests/userprog/wait-bad-pid.c create mode 100644 src/tests/userprog/wait-bad-pid.ck create mode 100644 src/tests/userprog/wait-killed.c create mode 100644 src/tests/userprog/wait-killed.ck create mode 100644 src/tests/userprog/wait-load-kill.c create mode 100644 src/tests/userprog/wait-load-kill.ck create mode 100644 src/tests/userprog/wait-simple.c create mode 100644 src/tests/userprog/wait-simple.ck create mode 100644 src/tests/userprog/wait-twice.c create mode 100644 src/tests/userprog/wait-twice.ck create mode 100644 src/tests/userprog/write-bad-fd.c create mode 100644 src/tests/userprog/write-bad-fd.ck create mode 100644 src/tests/userprog/write-bad-ptr.c create mode 100644 src/tests/userprog/write-bad-ptr.ck create mode 100644 src/tests/userprog/write-boundary.c create mode 100644 src/tests/userprog/write-boundary.ck create mode 100644 src/tests/userprog/write-normal.c create mode 100644 src/tests/userprog/write-normal.ck create mode 100644 src/tests/userprog/write-stdin.c create mode 100644 src/tests/userprog/write-stdin.ck create mode 100644 src/tests/userprog/write-zero.c create mode 100644 src/tests/userprog/write-zero.ck create mode 100644 src/tests/vm/Grading create mode 100644 src/tests/vm/Make.tests create mode 100644 src/tests/vm/Rubric.functionality create mode 100644 src/tests/vm/Rubric.robustness create mode 100644 src/tests/vm/child-inherit.c create mode 100644 src/tests/vm/child-linear.c create mode 100644 src/tests/vm/child-mm-wrt.c create mode 100644 src/tests/vm/child-qsort-mm.c create mode 100644 src/tests/vm/child-qsort.c create mode 100644 src/tests/vm/child-sort.c create mode 100644 src/tests/vm/mmap-bad-fd.c create mode 100644 src/tests/vm/mmap-bad-fd.ck create mode 100644 src/tests/vm/mmap-clean.c create mode 100644 src/tests/vm/mmap-clean.ck create mode 100644 src/tests/vm/mmap-close.c create mode 100644 src/tests/vm/mmap-close.ck create mode 100644 src/tests/vm/mmap-exit.c create mode 100644 src/tests/vm/mmap-exit.ck create mode 100644 src/tests/vm/mmap-inherit.c create mode 100644 src/tests/vm/mmap-inherit.ck create mode 100644 src/tests/vm/mmap-misalign.c create mode 100644 src/tests/vm/mmap-misalign.ck create mode 100644 src/tests/vm/mmap-null.c create mode 100644 src/tests/vm/mmap-null.ck create mode 100644 src/tests/vm/mmap-over-code.c create mode 100644 src/tests/vm/mmap-over-code.ck create mode 100644 src/tests/vm/mmap-over-data.c create mode 100644 src/tests/vm/mmap-over-data.ck create mode 100644 src/tests/vm/mmap-over-stk.c create mode 100644 src/tests/vm/mmap-over-stk.ck create mode 100644 src/tests/vm/mmap-overlap.c create mode 100644 src/tests/vm/mmap-overlap.ck create mode 100644 src/tests/vm/mmap-read.c create mode 100644 src/tests/vm/mmap-read.ck create mode 100644 src/tests/vm/mmap-remove.c create mode 100644 src/tests/vm/mmap-remove.ck create mode 100644 src/tests/vm/mmap-shuffle.c create mode 100644 src/tests/vm/mmap-shuffle.ck create mode 100644 src/tests/vm/mmap-twice.c create mode 100644 src/tests/vm/mmap-twice.ck create mode 100644 src/tests/vm/mmap-unmap.c create mode 100644 src/tests/vm/mmap-unmap.ck create mode 100644 src/tests/vm/mmap-write.c create mode 100644 src/tests/vm/mmap-write.ck create mode 100644 src/tests/vm/mmap-zero.c create mode 100644 src/tests/vm/mmap-zero.ck create mode 100644 src/tests/vm/page-linear.c create mode 100644 src/tests/vm/page-linear.ck create mode 100644 src/tests/vm/page-merge-mm.c create mode 100644 src/tests/vm/page-merge-mm.ck create mode 100644 src/tests/vm/page-merge-par.c create mode 100644 src/tests/vm/page-merge-par.ck create mode 100644 src/tests/vm/page-merge-seq.c create mode 100644 src/tests/vm/page-merge-seq.ck create mode 100644 src/tests/vm/page-merge-stk.c create mode 100644 src/tests/vm/page-merge-stk.ck create mode 100644 src/tests/vm/page-parallel.c create mode 100644 src/tests/vm/page-parallel.ck create mode 100644 src/tests/vm/page-shuffle.c create mode 100644 src/tests/vm/page-shuffle.ck create mode 100644 src/tests/vm/parallel-merge.c create mode 100644 src/tests/vm/parallel-merge.h create mode 100644 src/tests/vm/process_death.pm create mode 100644 src/tests/vm/pt-bad-addr.c create mode 100644 src/tests/vm/pt-bad-addr.ck create mode 100644 src/tests/vm/pt-bad-read.c create mode 100644 src/tests/vm/pt-bad-read.ck create mode 100644 src/tests/vm/pt-big-stk-obj.c create mode 100644 src/tests/vm/pt-big-stk-obj.ck create mode 100644 src/tests/vm/pt-grow-bad.c create mode 100644 src/tests/vm/pt-grow-bad.ck create mode 100644 src/tests/vm/pt-grow-pusha.c create mode 100644 src/tests/vm/pt-grow-pusha.ck create mode 100644 src/tests/vm/pt-grow-stack.c create mode 100644 src/tests/vm/pt-grow-stack.ck create mode 100644 src/tests/vm/pt-grow-stk-sc.c create mode 100644 src/tests/vm/pt-grow-stk-sc.ck create mode 100644 src/tests/vm/pt-overflowstk.c create mode 100644 src/tests/vm/pt-overflowstk.ck create mode 100644 src/tests/vm/pt-write-code-2.c create mode 100644 src/tests/vm/pt-write-code.c create mode 100644 src/tests/vm/pt-write-code.ck create mode 100644 src/tests/vm/pt-write-code2.ck create mode 100644 src/tests/vm/qsort.c create mode 100644 src/tests/vm/qsort.h create mode 100644 src/tests/vm/sample.inc create mode 100644 src/tests/vm/sample.txt create mode 100644 src/threads/.gitignore create mode 100644 src/threads/Make.vars create mode 100644 src/threads/Makefile create mode 100644 src/threads/flags.h create mode 100644 src/threads/init.c create mode 100644 src/threads/init.h create mode 100644 src/threads/interrupt.c create mode 100644 src/threads/interrupt.h create mode 100644 src/threads/intr-stubs.S create mode 100644 src/threads/intr-stubs.h create mode 100644 src/threads/io.h create mode 100644 src/threads/kernel.lds.S create mode 100644 src/threads/loader.S create mode 100644 src/threads/loader.h create mode 100644 src/threads/malloc.c create mode 100644 src/threads/malloc.h create mode 100644 src/threads/palloc.c create mode 100644 src/threads/palloc.h create mode 100644 src/threads/pte.h create mode 100644 src/threads/start.S create mode 100644 src/threads/switch.S create mode 100644 src/threads/switch.h create mode 100644 src/threads/synch.c create mode 100644 src/threads/synch.h create mode 100644 src/threads/thread.c create mode 100644 src/threads/thread.h create mode 100644 src/threads/vaddr.h create mode 100644 src/userprog/.gitignore create mode 100644 src/userprog/Make.vars create mode 100644 src/userprog/Makefile create mode 100644 src/userprog/exception.c create mode 100644 src/userprog/exception.h create mode 100644 src/userprog/gdt.c create mode 100644 src/userprog/gdt.h create mode 100644 src/userprog/pagedir.c create mode 100644 src/userprog/pagedir.h create mode 100644 src/userprog/process.c create mode 100644 src/userprog/process.h create mode 100644 src/userprog/syscall.c create mode 100644 src/userprog/syscall.h create mode 100644 src/userprog/tss.c create mode 100644 src/userprog/tss.h create mode 100644 src/utils/.gitignore create mode 100644 src/utils/Makefile create mode 100644 src/utils/Pintos.pm create mode 100755 src/utils/backtrace create mode 100755 src/utils/pintos create mode 100755 src/utils/pintos-gdb create mode 100755 src/utils/pintos-mkdisk create mode 100644 src/utils/pintos-set-cmdline create mode 100644 src/utils/setitimer-helper.c create mode 100644 src/utils/squish-pty.c create mode 100644 src/utils/squish-unix.c create mode 100644 src/vm/.gitignore create mode 100644 src/vm/Make.vars create mode 100644 src/vm/Makefile create mode 100644 tests/.gitignore create mode 100644 tests/Makefile diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5d8d05c --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +#ignore temp files +*~ + +#ignore pdf files (just keep source files) +*.pdf + +#ignore junk files from latex output +*.out +*.log +*.aux +*.dvi +*.ps +*minted* + +#ignore junk files from compiling C code +*.o + +#ignore other junk files +*.backup +*.kate-swp +*.swp +*.snm +*.vrb +*.nav +*.toc + diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..784002e --- /dev/null +++ b/AUTHORS @@ -0,0 +1,43 @@ +src -*- text -*- +--- + +* Pintos core originally written by Ben Pfaff . + +* Additional features contributed by Anthony Romano . + +* The original structure and form of this operating system is inspired + by the Nachos system from the University of California, Berkeley. A + few of the source files are more-or-less literal translations of the + Nachos C++ code into C. These files bear the original UCB license + notice. + +projects +-------- + +* The projects are primarily the creation of Ben Pfaff + . + +* Godmar Back made significant contributions to + project design. + +* Although little remains unchanged, the projects were originally + derived from those designed for Nachos by current and former CS140 + teaching assistants at Stanford University, including at least the + following people: + + - Yu Ping + + - Greg Hutchins + + - Kelly Shaw , + + - Paul Twohey + + - Sameer Qureshi + + - John Rector + + If you're not on this list but should be, please let me know. + +* Example code for condition variables is from classroom slides + originally by Dawson Engler and updated by Mendel Roseblum. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..64103d0 --- /dev/null +++ b/LICENSE @@ -0,0 +1,56 @@ +Pintos, including its documentation, is subject to the following +license: + + Copyright (C) 2004, 2005, 2006 Board of Trustees, Leland Stanford + Jr. University. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +A few individual files in Pintos were originally derived from other +projects, but they have been extensively modified for use in Pintos. +The original code falls under the original license, and modifications +for Pintos are additionally covered by the Pintos license above. + +In particular, code derived from Nachos is subject to the following +license: + +/* Copyright (c) 1992-1996 The Regents of the University of California. + All rights reserved. + + Permission to use, copy, modify, and distribute this software + and its documentation for any purpose, without fee, and + without written agreement is hereby granted, provided that the + above copyright notice and the following two paragraphs appear + in all copies of this software. + + IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO + ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR + CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE + AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA + HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" + BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + MODIFICATIONS. +*/ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..2c374e7 --- /dev/null +++ b/Makefile @@ -0,0 +1,13 @@ +CLEAN_SUBDIRS = src doc tests + +all:: + @echo "This makefile has only 'clean' and 'check' targets." + +clean:: + for d in $(CLEAN_SUBDIRS); do $(MAKE) -C $$d $@; done + +distclean:: clean + find . -name '*~' -exec rm '{}' \; + +check:: + make -C tests $@ diff --git a/doc/.gitignore b/doc/.gitignore new file mode 100644 index 0000000..b5ab7c5 --- /dev/null +++ b/doc/.gitignore @@ -0,0 +1,26 @@ +*.aux +*.cp +*.dvi +*.fn +*.info* +*.ky +*.log +*.pg +*.toc +*.tp +*.vr +/pintos-ic.fns +/pintos-ic.tps +/pintos-ic.vrs +mlfqs1.pdf +mlfqs1.png +mlfqs2.pdf +mlfqs2.png +pintos-ic.html +pintos-ic.pdf +pintos-ic.ps +pintos.text +pintos-ic_*.html +projects.html +sample.tmpl.texi +task0_sheet.pdf diff --git a/doc/44bsd.texi b/doc/44bsd.texi new file mode 100644 index 0000000..41b7a7e --- /dev/null +++ b/doc/44bsd.texi @@ -0,0 +1,403 @@ +@node 4.4BSD Scheduler +@appendix 4.4@acronym{BSD} Scheduler + +@iftex +@macro tm{TEX} +@math{\TEX\} +@end macro +@macro nm{TXT} +@end macro +@macro am{TEX, TXT} +@math{\TEX\} +@end macro +@end iftex + +@ifnottex +@macro tm{TEX} +@end macro +@macro nm{TXT} +@w{\TXT\} +@end macro +@macro am{TEX, TXT} +@w{\TXT\} +@end macro +@end ifnottex + +@ifhtml +@macro math{TXT} +\TXT\ +@end macro +@end ifhtml + +@macro m{MATH} +@am{\MATH\, \MATH\} +@end macro + +The goal of a general-purpose scheduler is to balance threads' different +scheduling needs. Threads that perform a lot of I/O require a fast +response time to keep input and output devices busy, but need little CPU +time. On the other hand, CPU-bound threads need to receive a lot of +CPU time to finish their work, but have no requirement for fast response +time. Other threads lie somewhere in between, with periods of I/O +punctuated by periods of computation, and thus have requirements that +vary over time. A well-designed scheduler can often accommodate threads +with all these requirements simultaneously. + +For task 1, you must implement the scheduler described in this +appendix. Our scheduler resembles the one described in @bibref{McKusick}, +which is one example of a @dfn{multilevel feedback queue} scheduler. +This type of scheduler maintains several queues of ready-to-run threads, +where each queue holds threads with a different priority. At any given +time, the scheduler chooses a thread from the highest-priority non-empty +queue. If the highest-priority queue contains multiple threads, then +they run in ``round robin'' order. + +Multiple facets of the scheduler require data to be updated after a +certain number of timer ticks. In every case, these updates should +occur before any ordinary kernel thread has a chance to run, so that +there is no chance that a kernel thread could see a newly increased +@func{timer_ticks} value but old scheduler data values. + +The 4.4@acronym{BSD} scheduler does not include priority donation. + +@menu +* Thread Niceness:: +* Calculating Priority:: +* Calculating recent_cpu:: +* Calculating load_avg:: +* 4.4BSD Scheduler Summary:: +* Fixed-Point Real Arithmetic:: +@end menu + +@node Thread Niceness +@section Niceness + +Thread priority is dynamically determined by the scheduler using a +formula given below. However, each thread also has an integer +@dfn{nice} value that determines how ``nice'' the thread should be to +other threads. A @var{nice} of zero does not affect thread priority. A +positive @var{nice}, to the maximum of 20, decreases the priority of a +thread and causes it to give up some CPU time it would otherwise receive. +On the other hand, a negative @var{nice}, to the minimum of -20, tends +to take away CPU time from other threads. + +The initial thread starts with a @var{nice} value of zero. Other +threads start with a @var{nice} value inherited from their parent +thread. You must implement the functions described below, which are for +use by test programs. We have provided skeleton definitions for them in +@file{threads/thread.c}. + +@deftypefun int thread_get_nice (void) +Returns the current thread's @var{nice} value. +@end deftypefun + +@deftypefun void thread_set_nice (int @var{new_nice}) +Sets the current thread's @var{nice} value to @var{new_nice} and +recalculates the thread's priority based on the new value +(@pxref{Calculating Priority}). If the running thread no longer has the +highest priority, yields. +@end deftypefun + +@node Calculating Priority +@section Calculating Priority + +Our scheduler has 64 priorities and thus 64 ready queues, numbered 0 +(@code{PRI_MIN}) through 63 (@code{PRI_MAX}). Lower numbers correspond +to lower priorities, so that priority 0 is the lowest priority +and priority 63 is the highest. Thread priority is calculated initially +at thread initialization. It is also recalculated for each thread (if necessary) +on every fourth clock tick. +In either situation, it is determined by the formula: + +@center @t{@var{priority} = @code{PRI_MAX} - (@var{recent_cpu} / 4) - (@var{nice} * 2)}, + +@noindent where @var{recent_cpu} is an estimate of the CPU time the +thread has used recently (see below) and @var{nice} is the thread's +@var{nice} value. The result should be rounded down to the nearest +integer (truncated). +The coefficients @math{1/4} and 2 on @var{recent_cpu} +and @var{nice}, respectively, have been found to work well in practice +but lack deeper meaning. The calculated @var{priority} is always +adjusted to lie in the valid range @code{PRI_MIN} to @code{PRI_MAX}. + +This formula gives a thread that has received CPU time recently lower priority +for being reassigned the CPU the next time the scheduler runs. +This is key to preventing starvation: +a thread that has not received any CPU time recently will have a +@var{recent_cpu} of 0, which barring a high @var{nice} value should +ensure that it receives CPU time soon. +This technique is sometimes referred to as "aging" in the literature. + +@node Calculating recent_cpu +@section Calculating @var{recent_cpu} + +We wish @var{recent_cpu} to measure how much CPU time each process has +received ``recently.'' Furthermore, as a refinement, more recent CPU +time should be weighted more heavily than less recent CPU time. One +approach would use an array of @var{n} elements to +track the CPU time received in each of the last @var{n} seconds. +However, this approach requires O(@var{n}) space per thread and +O(@var{n}) time per calculation of a new weighted average. + +Instead, we use an @dfn{exponentially weighted moving average}, which +takes this general form: + +@center @tm{x(0) = f(0),}@nm{x(0) = f(0),} +@center @tm{x(t) = ax(t-1) + (1-a)f(t),}@nm{x(t) = a*x(t-1) + (1-a)*f(t),} +@center @tm{a = k/(k+1),}@nm{a = k/(k+1),} + +@noindent where @math{x(t)} is the moving average at integer time @am{t +\ge 0, t >= 0}, @math{f(t)} is the function being averaged, and @math{k +> 0} controls the rate of decay. We can iterate the formula over a few +steps as follows: + +@center @math{x(0) = f(0)}, +@center @am{x(1) = af(0) + (1-a)f(1), x(1) = a*f(0) + (1-a)*f(1)}, +@center @am{\vdots, ...} +@center @am{x(4) = a^4f(0) + a^3(1-a)f(1) + a^2(1-a)f(2) + a(1-a)f(3) + (1-a)f(4), x(4) = a**4*f(0) + a**3*(1-a)*f(1) + a**2*(1-a)*f(2) + a*(1-a)*f(3) + (1-a)*f(4)}. + +@noindent The value of @math{f(t)} has a weight of @math{(1-a)} at time @math{t}, +a weight of @math{a(1-a)} at time @math{t+1}, @am{a^2(1-a), a**2(1-a)} at time +@math{t+2}, and so on. We can also relate @math{x(t)} to @math{k}: +@math{f(t)} has a weight of approximately @math{1/e} at time @math{t+k}, +approximately @am{1/e^2, 1/e**2} at time @am{t+2k, t+2*k}, and so on. +From the opposite direction, @math{f(t)} decays to weight @math{w} at around +time @am{t + \log_aw, t + ln(w)/ln(a)}. + +The initial value of @var{recent_cpu} is 0 in the first thread +created, or the parent's value in other new threads. Each time a timer +interrupt occurs, @var{recent_cpu} is incremented by 1 for the running +thread only, unless the idle thread is running. In addition, once per +second the value of @var{recent_cpu} +is recalculated for every thread (whether running, ready, or blocked), +using this formula: + +@center @t{@var{recent_cpu} = (2*@var{load_avg})/(2*@var{load_avg} + 1) * @var{recent_cpu} + @var{nice}}, + +@noindent where @var{load_avg} is a moving average of the number of +threads ready to run (see below). If @var{load_avg} is 1, indicating +that a single thread, on average, is competing for the CPU, then the +current value of @var{recent_cpu} decays to a weight of .1 in +@am{\log_{2/3}.1 \approx 6, ln(.1)/ln(2/3) = approx. 6} seconds; if +@var{load_avg} is 2, then decay to a weight of .1 takes @am{\log_{3/4}.1 +\approx 8, ln(.1)/ln(3/4) = approx. 8} seconds. The effect is that +@var{recent_cpu} estimates the amount of CPU time the thread has +received ``recently,'' with the rate of decay inversely proportional to +the number of threads competing for the CPU. + +Assumptions made by some of the tests require that these recalculations of +@var{recent_cpu} be made exactly when the system tick counter reaches a +multiple of a second, that is, when @code{timer_ticks () % TIMER_FREQ == +0}, and not at any other time. + +The value of @var{recent_cpu} can be negative for a thread with a +negative @var{nice} value. Do not clamp negative @var{recent_cpu} to 0. + +You may need to think about the order of calculations in this formula. +We recommend computing the coefficient of @var{recent_cpu} first, then +multiplying. In the past, some students have reported that multiplying +@var{load_avg} by @var{recent_cpu} directly can cause overflow. + +You must implement @func{thread_get_recent_cpu}, for which there is a +skeleton in @file{threads/thread.c}. + +@deftypefun int thread_get_recent_cpu (void) +Returns 100 times the current thread's @var{recent_cpu} value, rounded +to the nearest integer. +@end deftypefun + +@node Calculating load_avg +@section Calculating @var{load_avg} + +Finally, @var{load_avg}, often known as the system load average, +estimates the average number of threads ready to run over the past +minute. Like @var{recent_cpu}, it is an exponentially weighted moving +average. Unlike @var{priority} and @var{recent_cpu}, @var{load_avg} is +system-wide, not thread-specific. At system boot, it is initialized to +0. Once per second thereafter, it is updated according to the following +formula: + +@center @t{@var{load_avg} = (59/60)*@var{load_avg} + (1/60)*@var{ready_threads}}, + +@noindent where @var{ready_threads} is the number of threads that are +either running or ready to run at time of update (not including the idle +thread). + +Because of assumptions made by some of the tests, @var{load_avg} must be +updated exactly when the system tick counter reaches a multiple of a +second, that is, when @code{timer_ticks () % TIMER_FREQ == 0}, and not +at any other time. + +You must implement @func{thread_get_load_avg}, for which there is a +skeleton in @file{threads/thread.c}. + +@deftypefun int thread_get_load_avg (void) +Returns 100 times the current system load average, rounded to the +nearest integer. +@end deftypefun + +@node 4.4BSD Scheduler Summary +@section Summary + +The following formulas summarize the calculations required to implement the +scheduler. They are not a complete description of the scheduler's requirements. + +Every thread has a @var{nice} value between -20 and 20 directly under +its control. Each thread also has a priority, between 0 +(@code{PRI_MIN}) through 63 (@code{PRI_MAX}), which is recalculated (as necessary) +using the following formula: + +@center @t{@var{priority} = @code{PRI_MAX} - (@var{recent_cpu} / 4) - (@var{nice} * 2)}. + +@var{recent_cpu} measures the amount of CPU time a thread has received +``recently.'' On each timer tick, the running thread's @var{recent_cpu} +is incremented by 1. Once per second, every thread's @var{recent_cpu} +is updated this way: + +@center @t{@var{recent_cpu} = (2*@var{load_avg})/(2*@var{load_avg} + 1) * @var{recent_cpu} + @var{nice}}. + +@var{load_avg} estimates the average number of threads ready to run over +the past minute. It is initialized to 0 at boot and recalculated once +per second as follows: + +@center @t{@var{load_avg} = (59/60)*@var{load_avg} + (1/60)*@var{ready_threads}}. + +@noindent where @var{ready_threads} is the number of threads that are +either running or ready to run at time of update (not including the idle +thread). + +Note that it is important that each of these calculations is based on up-to-date data values. +That is, the calculation of each thread's @var{priority} should be based on the most recent @var{recent_cpu} value +and, similarly, the calculation of @var{recent_cpu} should itself be based on the most recent @var{load_avg} value. +You should take these dependencies into account when implementing these calculations. + +You should also think about the efficiency of your calculations. +The more time your scheduler spends working on these calculations, +the less time your actual processes will have to run. +It is important, therefore, to only perform calculations when absolutely necessary. + +@node Fixed-Point Real Arithmetic +@section Fixed-Point Real Arithmetic + +In the formulas above, @var{priority}, @var{nice}, and +@var{ready_threads} are integers, but @var{recent_cpu} and @var{load_avg} +are real numbers. Unfortunately, PintOS does not support floating-point +arithmetic in the kernel, because it would +complicate and slow the kernel. Real kernels often have the same +limitation, for the same reason. This means that calculations on real +quantities must be simulated using integers. This is not +difficult, but many students do not know how to do it. This +section explains the basics. + +The fundamental idea is to treat the rightmost bits of an integer as +representing a fraction. For example, we can designate the lowest 14 +bits of a signed 32-bit integer as fractional bits, so that an integer +@m{x} represents the real number +@iftex +@m{x/2^{14}}. +@end iftex +@ifnottex +@m{x/(2**14)}, where ** represents exponentiation. +@end ifnottex +This is called a 17.14 fixed-point number representation, because there +are 17 bits before the decimal point, 14 bits after it, and one sign +bit.@footnote{Because we are working in binary, the ``decimal'' point +might more correctly be called the ``binary'' point, but the meaning +should be clear.} A number in 17.14 format represents, at maximum, a +value of @am{(2^{31} - 1) / 2^{14} \approx, (2**31 - 1)/(2**14) = +approx.} 131,071.999. + +Suppose that we are using a @m{p.q} fixed-point format, and let @am{f = +2^q, f = 2**q}. By the definition above, we can convert an integer or +real number into @m{p.q} format by multiplying with @m{f}. For example, +in 17.14 format the fraction 59/60 used in the calculation of +@var{load_avg}, above, is @am{(59/60)2^{14}, 59/60*(2**14)} = 16,110. +To convert a fixed-point value back to an +integer, divide by @m{f}. (The normal @samp{/} operator in C rounds +toward zero, that is, it rounds positive numbers down and negative +numbers up. To round to nearest, add @m{f / 2} to a positive number, or +subtract it from a negative number, before dividing.) + +Many operations on fixed-point numbers are straightforward. Let +@code{x} and @code{y} be fixed-point numbers, and let @code{n} be an +integer. Then the sum of @code{x} and @code{y} is @code{x + y} and +their difference is @code{x - y}. The sum of @code{x} and @code{n} is +@code{x + n * f}; difference, @code{x - n * f}; product, @code{x * n}; +quotient, @code{x / n}. + +Multiplying two fixed-point values has two complications. First, the +decimal point of the result is @m{q} bits too far to the left. Consider +that @am{(59/60)(59/60), (59/60)*(59/60)} should be slightly less than +1, but @tm{16,110\times 16,110}@nm{16,110*16,110} = 259,532,100 is much +greater than @am{2^{14},2**14} = 16,384. Shifting @m{q} bits right, we +get @tm{259,532,100/2^{14}}@nm{259,532,100/(2**14)} = 15,840, or about 0.97, +the correct answer. Second, the multiplication can overflow even though +the answer is representable. For example, 64 in 17.14 format is +@am{64 \times 2^{14}, 64*(2**14)} = 1,048,576 and its square @am{64^2, +64**2} = 4,096 is well within the 17.14 range, but @tm{1,048,576^2 = +2^{40}}@nm{1,048,576**2 = 2**40}, greater than the maximum signed 32-bit +integer value @am{2^{31} - 1, 2**31 - 1}. An easy solution is to do the +multiplication as a 64-bit operation. The product of @code{x} and +@code{y} is then @code{((int64_t) x) * y / f}. + +Dividing two fixed-point values has opposite issues. The +decimal point will be too far to the right, which we fix by shifting the +dividend @m{q} bits to the left before the division. The left shift +discards the top @m{q} bits of the dividend, which we can again fix by +doing the division in 64 bits. Thus, the quotient when @code{x} is +divided by @code{y} is @code{((int64_t) x) * f / y}. + +This section has consistently used multiplication or division by @m{f}, +instead of @m{q}-bit shifts, for two reasons. First, multiplication and +division do not have the surprising operator precedence of the C shift +operators. Second, multiplication and division are well-defined on +negative operands, but the C shift operators are not. Take care with +these issues in your implementation. + +The following table summarizes how fixed-point arithmetic operations can +be implemented in C. In the table, @code{x} and @code{y} are +fixed-point numbers, @code{n} is an integer, fixed-point numbers are in +signed @m{p.q} format where @m{p + q = 31}, and @code{f} is @code{1 << +q}: + +@html +
+@end html +@multitable @columnfractions .5 .5 +@item Convert @code{n} to fixed point: +@tab @code{n * f} + +@item Convert @code{x} to integer (rounding toward zero): +@tab @code{x / f} + +@item Convert @code{x} to integer (rounding to nearest): +@tab @code{(x + f / 2) / f} if @code{x >= 0}, @* +@code{(x - f / 2) / f} if @code{x <= 0}. + +@item Add @code{x} and @code{y}: +@tab @code{x + y} + +@item Subtract @code{y} from @code{x}: +@tab @code{x - y} + +@item Add @code{x} and @code{n}: +@tab @code{x + n * f} + +@item Subtract @code{n} from @code{x}: +@tab @code{x - n * f} + +@item Multiply @code{x} by @code{y}: +@tab @code{((int64_t) x) * y / f} + +@item Multiply @code{x} by @code{n}: +@tab @code{x * n} + +@item Divide @code{x} by @code{y}: +@tab @code{((int64_t) x) * f / y} + +@item Divide @code{x} by @code{n}: +@tab @code{x / n} +@end multitable +@html +
+@end html diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 0000000..41d03e2 --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,46 @@ +TEXIS = pintos-ic.texi intro.texi codebase.texi threads.texi userprog.texi vm.texi \ +license.texi reference.texi 44bsd.texi standards.texi \ +doc.texi sample.tmpl.texi devel.texi debug.texi installation.texi \ +bibliography.texi localsettings.texi task0_questions.texi localgitinstructions.texi + +all: pintos-ic.html pintos-ic.info pintos-ic.dvi pintos-ic.ps pintos-ic.pdf task0_sheet.pdf alarmclock.pdf + +pintos-ic.html: $(TEXIS) texi2html + ./texi2html -toc_file=$@ -split=chapter -nosec_nav -nomenu -init_file ./pintos-t2h.init $< + +pintos-ic.info: $(TEXIS) + makeinfo $< + +pintos-ic.text: $(TEXIS) + makeinfo --plaintext -o $@ $< + +pintos-ic.dvi: $(TEXIS) + texi2dvi $< -o $@ + +pintos-ic.ps: pintos-ic.dvi + dvips $< -o $@ + +pintos-ic.pdf: $(TEXIS) + texi2pdf $< -o $@ + +task0_sheet.pdf : task0_sheet.texi task0_questions.texi + texi2pdf $< -o $@ + +alarmclock.pdf : alarmclock.tex + pdflatex -shell-escape alarmclock + +%.texi: % + sed < $< > $@ 's/\([{}@]\)/\@\1/g;' + +clean: + rm -f *.info* *.html + rm -f *.aux *.cp *.dvi *.fn *.fns *.ky *.log *.pdf *.ps *.toc *.tp *.tps *.vr *.vrs *~ + rm -rf WWW + rm -f sample.tmpl.texi + rm -f alarmclock.pdf + +dist: pintos-ic.html pintos-ic.pdf + rm -rf WWW + mkdir WWW WWW/specs + cp *.html *.pdf *.css *.tmpl WWW + (cd ../specs && cp -r *.pdf freevga kbd sysv-abi-update.html ../doc/WWW/specs) diff --git a/doc/alarmclock.tex b/doc/alarmclock.tex new file mode 100644 index 0000000..fb1d4a3 --- /dev/null +++ b/doc/alarmclock.tex @@ -0,0 +1,385 @@ +\documentclass[a4paper,11pt]{article} + +\setcounter{tocdepth}{3} + +\usepackage[margin=1in]{geometry} +\usepackage{amsthm} +\usepackage{url} +\usepackage{microtype} +\usepackage{xcolor} +\usepackage{minted} +\usepackage[tt=false, type1=true]{libertine} +\usepackage[libertine]{newtxmath} +\usepackage[scaled=0.8, lining]{FiraMono} +\usepackage[T1]{fontenc} +\usepackage{setspace} +\usepackage{hyperref} + +\setstretch{1.15} + +\definecolor[named]{ACMPurple}{cmyk}{0.55,1,0,0.15} +\definecolor[named]{ACMDarkBlue}{cmyk}{1,0.58,0,0.21} +\hypersetup{colorlinks, + linkcolor=ACMPurple, + citecolor=ACMPurple, + urlcolor=ACMDarkBlue, + filecolor=ACMDarkBlue} + +\usemintedstyle{xcode} + +%inline code styling +\newmintinline[shell]{shell}{fontsize=\normalsize, breaklines} +\newmintinline[asm]{asm}{fontsize=\normalsize, breaklines} + +% For illustrations +\usepackage{tikz} + +%% Comments +\newif\ifcomment + +% Comment this line to remove the comments +\commenttrue + +\newcommand{\genericcomment}[2]{ +\ifcomment +\begin{center} +\fbox{ +\begin{minipage}{4in} +{\bf {#2}'s comment:} {\it #1} +\end{minipage}} +\end{center} +\fi} + +\newcommand{\boxit}[1]{ +\begin{center} + \fbox{ + \begin{minipage}{6in} + #1 + \end{minipage} + } +\end{center} +} + +\newcommand{\markcomment}[1]{ +\genericcomment{#1}{Mark}} + +\begin{document} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\title{PintOS Task 0 - Codebase Preview} +\date{} + +\author{ +COMP50007.1 - Laboratory 2 \\ +Department of Computing \\ +Imperial College London +} + +\maketitle + +%%%%%%%%%%%%%%%%%%%%% +\section*{Summary} +%%%%%%%%%%%%%%%%%%%%% +This task is divided into two parts: a codebase preview and a small coding exercise. +The codebase preview has been designed to help you familiarise yourself with how PintOS is structured +and requires you to complete a short MCQ AnswerBook assessment to check your understanding of the provided PintOS code. +The coding exercise has been designed to help you understand how PintOS works +and is concerned with developing a simple feature in PintOS, called Alarm Clock. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section*{Submit by 19:00 on Wednesday 9th October 2024} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%% +\section*{What To Do:} +%%%%%%%%%%%%%%%%%%%%%%%%% + +\subsection*{Getting the files required for the exercise} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +You have each been provided with a Git repository on the department's \shell{GitLab} server that contains the files required for this exercise. +To obtain this skeleton repository you will need to clone it into your local workspace. +You can do this with the following command: +% +\begin{minted}{shell} +prompt> git clone https://gitlab.doc.ic.ac.uk/lab2425_autumn/pintos_task0_.git +\end{minted} +% +replacing \shell{} with your normal college login. +You will be prompted for your normal college username and password. + +You can also clone the skeleton repository via SSH (and avoid having to type in your username/password for every future clone, pull and push) if you have set up the required public/private keys on GitLab with the command: +% +\begin{minted}{shell} + prompt> git clone git@gitlab.doc.ic.ac.uk:lab2425_autumn/pintos_task0_.git +\end{minted} +% +again, replacing \shell{} with your normal college login. +Please feel free to ask a member of the lab support team for help with this if you want to access \shell{GitLab} via SSH but are unsure of how to set it up. + +Using either of these commands will create a directory in your current location called \shell{pintos_task0_}. +For more details about the contents of this repository see section 1.1.1 of the PintOS manual. + +This is generally the way that we will hand out all lab exercises this year, so you should ensure that you are comfortable with the process. + + +\subsection*{Finding out about PintOS} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Everything that you need to know for the whole PintOS project can be found in the PintOS manual, +so it is a good idea to read it all eventually. +However, for the purposes of this codebase preview it should be sufficient that you carefully read sections 1 and 2 +as well as appendicies A, C, D and E. +For some of the MCQ AnswerBook questions, examining the PintOS code-base will also be useful, +particularly \shell{thread.c}, \shell{thread.h} and \shell{synch} in the \shell{src/threads/} directory +and \shell{list.c} in the \shell{src/lib/kernel/} directory.\\ + +\noindent You can find additional guidance on this Task in section 2 of the PintOS manual: ``Task 0: Alarm Clock'' + + +\subsection*{Working on PintOS} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +You should work on the files in your local workspace, making regular commits and pushes back to your \shell{GitLab} Git repository. +Recall that you will first need to add any new/modified files to your local Git workspace with: +% +\begin{minted}{shell} + prompt> git add +\end{minted} +% +You can then commit your changes to your local index with: +% +\begin{minted}{shell} + prompt> git commit -m "your *meaningful* commit message here" +\end{minted} +% +Finally you will need to push these changes from your local index to the Git repository with: +% +\begin{minted}{shell} + prompt> git push origin master +\end{minted} +% +You can check that a push succeeded by looking at the state of your repository using the \shell{GitLab} webpages: + +\url{https://gitlab.doc.ic.ac.uk/} + +\noindent (you will need to login with your normal college username and password). + +You are of course free to utilise the more advanced features of Git such as branching and tagging. +Further details can be found in your first year notes and at: + +\url{https://workspace.imperial.ac.uk/computing/Public/files/Git-Intro.pdf}.\\ + +{\bf Important:} Your final submission will be taken from your \shell{pintos_task0_} \shell{GitLab} repository, +so you must understand how to push your work to it correctly. +If in any doubt, come and get help from the TF office (room 306) or during one of the lab sessions. +It is {\bf your} responsibility to ensure that you submit the correct version of your work. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section*{Part A - Codebase Preview} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +In this part of the task you will be required to answer a series of MCQs (Multiple Choice Questions) that test your understanding of the basic PintOS concepts and the provided PintOS code-base. +If you have completed the pre-reading suggested above, then you should not find the MCQ AnswerBook test particularly challenging. + +The MCQ AnswerBook test will be scheduled on Scientia, and the questions will be based on the following areas of PintOS. +The test will be open-book, so you are advised to answer these questions yourelf ahead of time. + +\paragraph{Part 1:} +Which Git command should you run to retrieve a copy of your individual repository for PintOS Task 0 in your local directory? \\ +(\textit{Hint: be specific to this task and think about ease of use.}) + +\paragraph{Part 2:} +Why is using the {\tt strcpy()} function to copy strings usually a bad idea? \\ +(\textit{Hint: be sure to clearly identify the problem.}) + +\paragraph{Part 3:} +If test \shell{src/tests/devices/alarm-multiple} fails, where would you find its output and result logs? \\ +Provide both paths and filenames. \\ +(\textit{Hint: you might want to run this test and find out.}) + +\paragraph{Part 4:} +In PintOS, a thread is characterized by a struct and an execution stack. \\ +(a) What are the limitations on the size of these data structures? \\ +(b) Explain how this relates to stack overflow and how PintOS identifies if a stack overflow has occurred. + +\paragraph{Part 5:} +Explain how thread scheduling in PintOS currently works in roughly 300 words. +Include the chain of execution of function calls. \\ +(\textit{Hint: we expect you to at least mention which functions participate in a context switch, how they interact, how and when the thread state is modified and the role of interrupts.)} + +\paragraph{Part 6:} +In PintOS, what is the default length (in ticks \emph{and} in seconds) of a scheduler time slice? \\ +(\textit{Hint: read the Task 0 documentation carefully.}) + +\paragraph{Part 7:} +In PintOS, how would you print an unsigned 64 bit \shell{int}? +(Consider that you are working with C99). \\ +Don't forget to state any inclusions needed by your code. + +\paragraph{Part 8:} +Explain the property of {\bf reproducibility} and how the lack of reproducibility will affect debugging. + +\paragraph{Part 9:} +In PintOS, locks are implemented on top of semaphores.\\ +(a) How do the functions in the API of locks relate to those of semaphores?\\ +(b) What extra property do locks have that semaphores do not? + +\paragraph{Part 10:} +Define what is meant by a {\bf race-condition}. Why is the test \shell{ if(x \!= null) } +insufficient to prevent a segmentation fault from occurring on an attempted access to a structure through pointer \shell{x}?\\ +(\textit{Hint: you should assume that the pointer variable is correctly typed, that the structure was successfully initialised earlier in the program +and that there are other threads running in parallel.}) + +\pagebreak +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section*{Part B - The Alarm Clock} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +In this part, you are required to implement a simple functionality in PintOS and to answer the design document questions listed below. + +\subsection*{Coding the Alarm Clock in PintOS} +Reimplement \shell{timer_sleep()}, defined in '\shell{devices/timer.c}’.\\ + +\noindent Although a working implementation of \shell{timer_sleep()} is provided, it “busy waits,†that is, +it spins in a loop checking the current time and calling \shell{thread_yield()} until enough time has gone by. +You need to reimplement it to avoid busy waiting. +Further instructions and hints can be found in the PintOS manual.\\ + +\noindent The marks for this part are awarded as follows: + +Passing the Automated Tests ({\bf 8 marks}). + +Performance in the Code Review ({\bf 12 marks}). + +Answering the Design Document Questions below ({\bf 10 marks}). + +\subsection*{Task 0 Design Document Questions:} + +\subsubsection*{Data Structures} +A1: ({\bf 2 marks}) \\ +Copy here the declaration of each new or changed `\shell{struct}' or `\shell{struct}' member, +global or static variable, `\shell{typedef}', or enumeration. +Identify the purpose of each in roughly 25 words. + +\subsubsection*{Algorithms} +A2: ({\bf 2 marks}) \\ +Briefly describe what happens in a call to \shell{timer_sleep()}, including the actions performed by the timer interrupt handler on each timer tick. \\ + +\noindent A3: ({\bf 2 marks}) \\ +What steps are taken to minimize the amount of time spent in the timer interrupt handler? + +\subsubsection*{Synchronization} +A4: ({\bf 1 mark}) \\ +How are race conditions avoided when multiple threads call \shell{timer_sleep()} simultaneously? \\ + +\noindent A5: ({\bf 1 mark}) \\ +How are race conditions avoided when a timer interrupt occurs during a call to \shell{timer_sleep()}? + +\subsubsection*{Rationale} +A6: ({\bf 2 marks}) \\ +Why did you choose this design? \\ +In what ways is it superior to another design you considered? + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section*{Testing} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +As you work, you should \emph{add}, \emph{commit} and \emph{push} your changes to your Git repository, as discussed above. +You should also be carefully testing your work throughout the exercise. + +You should be used to regularly testing your code locally on your development machine, +but to help you ensure that your code will compile and run as expected in our testing environment, +we have provided you with the Lab Testing Service: \shell{LabTS}. + +\shell{LabTS} will clone your \shell{GitLab} repository and run several automated test processes over your work. +This will happen automatically after the deadline, but can also be requested during the course of the exercise (usually on a sub-set of the final tests). + +You can access the \shell{LabTS} webpages at: + +\url{https://teaching.doc.ic.ac.uk/labts} + +\noindent (note that you will be required to log-in with your normal college username and password.) + +If you click through to your \shell{pintos_task0_} repository you will see a list of the different versions of your work that you have pushed. +Next to each commit you will see a button that will allow you to request that this version of your work is run through the automated test process. +If you click this button your work will be tested (this may take a few minutes) and the results will appear in the relevant column.\\ + +{\bf Important:} It is {\bf your} responsibility to ensure that your code behaves as expected in our automated test environment. +Code that fails to compile/run in this environment will score {\bf zero marks} for implementation correctness. +You should find that this environment behaves like the set-up found on our lab machines. +If you are experiencing any problems in this regard then you should seek help from a lab demonstrator or the lab coordinator at the earliest opportunity. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section*{Submission} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Your \shell{GitLab} repository should contain the final submission for your alarm clock implementation. +\shell{LabTS} can be used to test any revision of your work that you wish. +However, you will still need to submit a \emph{revision id} to Scientia so that we know which version of your code you consider to be your final submission. +Prior to submission, you should check the state of your \shell{GitLab} repository using the \shell{LabTS} webpages: + +\url{https://teaching.doc.ic.ac.uk/labts} + +\noindent If you click through to your \shell{pintos_task0_} repository you will see a list of the different versions of your work that you have pushed. +Next to each commit you will see a link to that commit on \shell{GitLab} as well as a button to submit that version of your code for assessment. +Pressing this button will redirect you to Scientia (automatically submitting your revision id) +and prompt you to upload an answers file and a design document under the usual ``original work'' disclaimer. + +You should submit to Scientia the version of your code that you consider to be ``final''. +You can change this later by submitting a different version to Scientia as usual. +The submission button on LabTS will be replaced with a green confirmation label if the submission has been successful. + +You should submit your Task 0 design document (\shell{designT0.pdf}) and the chosen version of your code to Scientia by 19:00 on Wednesday 9th October 2024.\\ + + +%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section*{Assessment} +%%%%%%%%%%%%%%%%%%%%%%%%%%% +In total there are {\bf 50 marks} available in this exercise.\\ +These are allocated as follows: +% +\begin{center} +\begin{tabular}{l@{\qquad\qquad}l} + Part A: MCQ Answerbook Test & {\bf 20 marks} \\ + Part B: Automated Tests & {\bf 8 marks} \\ + Part B: Code Review & {\bf 12 marks} \\ + Part B: Design Document & {\bf 10 marks} \\ +\end{tabular} +\end{center} +% +Any program that does not compile and run will score {\bf 0 marks} for Part B: Automated Tests.\\[-0.8em] + +\noindent The marks for Part A will contribute to your COMP50004 Operating Systems coursework grade, +while your marks for Part B will contribute to your COMP50007.1 Laboratory 2 grade.\\ + +\noindent \textbf{We aim for feedback on this exercise to be returned by Wednesday 25th October 2023.} + +\subsubsection*{What should I expect from the Task 0 code-review?} + +The code-review for this task will be conducted offline, as it would be logistically +impossible to arrange face-to-face sessions with the whole cohort. +Our Task 0 code-review will cover \textbf{four} main areas: +functional correctness, efficiency, design quality and general coding style. + +\begin{itemize} + \item For \textbf{functional correctness}, we will be looking to see if your solution can handle many threads going to sleep or waking-up at the same time, without any unnecessary delays. + We will also be checking if your code for \shell{timer_sleep} and \shell{timer_interrupt} is free of any race conditions. + + \item For \textbf{efficiency}, we will be looking at what steps you have taken to minimise the time spent inside your timer interrupt handler. Think about how you store sleeping threads and track how long they must sleep for. We will also be looking at your use of memory. + + \item For \textbf{design quality}, we will be looking at how your have integrated your alarm-clock code with the rest of the provided operating system. We want to see clear module boundaries and use of abstraction. + + \item For \textbf{general coding style}, we will be paying attention to all of the usual elements of good style that you should be used to from last year (e.g. code layout, appropriate use of comments, avoiding magic numbers, etc.) as well as your use of git (e.g. commit frequency and commit message quality). +\end{itemize} + + + + + + + + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\end{document} diff --git a/doc/bibliography.texi b/doc/bibliography.texi new file mode 100644 index 0000000..627ef30 --- /dev/null +++ b/doc/bibliography.texi @@ -0,0 +1,154 @@ +@node Bibliography +@appendix Bibliography + +@macro bibdfn{cite} +@noindent @anchor{\cite\} +[\cite\].@w{ } +@end macro + +@menu +* Hardware References:: +* Software References:: +* Operating System Design References:: +@end menu + +@node Hardware References +@section Hardware References + +@bibdfn{IA32-v1} +IA-32 Intel Architecture Software Developer's Manual Volume 1: Basic +Architecture. Basic 80@var{x}86 architecture and programming +environment. Available via @uref{developer.intel.com}. Section numbers +in this document refer to revision 18. + +@bibdfn{IA32-v2a} +IA-32 Intel Architecture Software Developer's Manual +Volume 2A: Instruction Set Reference A-M. 80@var{x}86 instructions +whose names begin with A through M. Available via +@uref{developer.intel.com}. Section numbers in this document refer to +revision 18. + +@bibdfn{IA32-v2b} +IA-32 Intel Architecture Software Developer's Manual Volume 2B: +Instruction Set Reference N-Z. 80@var{x}86 instructions whose names +begin with N through Z. Available via @uref{developer.intel.com}. +Section numbers in this document refer to revision 18. + +@bibdfn{IA32-v3a} +IA-32 Intel Architecture Software Developer's Manual Volume 3A: System +Programming Guide. Operating system support, including segmentation, +paging, tasks, interrupt and exception handling. Available via +@uref{developer.intel.com}. Section numbers in this document refer to +revision 18. + +@bibdfn{FreeVGA} +@uref{specs/freevga/home.htm, , FreeVGA Project}. Documents the VGA video +hardware used in PCs. + +@bibdfn{kbd} +@uref{specs/kbd/scancodes.html, , Keyboard scancodes}. Documents PC keyboard +interface. + +@bibdfn{ATA-3} +@uref{specs/ata-3-std.pdf, , AT Attachment-3 Interface (ATA-3) Working +Draft}. Draft of an old version of the ATA aka IDE interface for the +disks used in most desktop PCs. + +@bibdfn{PC16550D} +@uref{specs/pc16550d.pdf, , National Semiconductor PC16550D Universal +Asynchronous Receiver/Transmitter with FIFOs}. Datasheet for a chip +used for PC serial ports. + +@bibdfn{8254} +@uref{specs/8254.pdf, , Intel 8254 Programmable Interval Timer}. +Datasheet for PC timer chip. + +@bibdfn{8259A} +@uref{specs/8259A.pdf, , Intel 8259A Programmable Interrupt Controller +(8259A/8259A-2)}. Datasheet for PC interrupt controller chip. + +@bibdfn{MC146818A} +@uref{specs/mc146818a.pdf, , Motorola MC146818A Real Time Clock Plus +Ram (RTC)}. Datasheet for PC real-time clock chip. + +@node Software References +@section Software References + +@bibdfn{ELF1} +@uref{specs/elf.pdf, , Tool Interface Standard (TIS) Executable and +Linking Format (ELF) Specification Version 1.2 Book I: Executable and +Linking Format}. The ubiquitous format for executables in modern Unix +systems. + +@bibdfn{ELF2} +@uref{specs/elf.pdf, , Tool Interface Standard (TIS) Executable and +Linking Format (ELF) Specification Version 1.2 Book II: Processor +Specific (Intel Architecture)}. 80@var{x}86-specific parts of ELF. + +@bibdfn{ELF3} +@uref{specs/elf.pdf, , Tool Interface Standard (TIS) Executable and +Linking Format (ELF) Specification Version 1.2 Book III: Operating +System Specific (UNIX System V Release 4)}. Unix-specific parts of +ELF. + +@bibdfn{SysV-ABI} +@uref{specs/sysv-abi-4.1.pdf, , System V Application Binary Interface: +Edition 4.1}. Specifies how applications interface with the OS under +Unix. + +@bibdfn{SysV-i386} +@uref{specs/sysv-abi-i386-4.pdf, , System V Application Binary +Interface: Intel386 Architecture Processor Supplement: Fourth +Edition}. 80@var{x}86-specific parts of the Unix interface. + +@bibdfn{SysV-ABI-update} +@uref{specs/sysv-abi-update.html/contents.html, , System V Application Binary +Interface---DRAFT---24 April 2001}. A draft of a revised version of +@bibref{SysV-ABI} which was never completed. + +@bibdfn{SUSv3} +The Open Group, @uref{http://www.unix.org/single_unix_specification/, +, Single UNIX Specification V3}, 2001. + +@bibdfn{Partitions} +A.@: E.@: Brouwer, @uref{specs/partitions/partition_tables.html, , +Minimal partition table specification}, 1999. + +@bibdfn{IntrList} +R.@: Brown, @uref{http://www.ctyme.com/rbrown.htm, , Ralf Brown's +Interrupt List}, 2000. + +@node Operating System Design References +@section Operating System Design References + +@bibdfn{Christopher} +W.@: A.@: Christopher, S.@: J.@: Procter, T.@: E.@: Anderson, +@cite{The Nachos instructional operating system}. +Proceedings of the @acronym{USENIX} Winter 1993 Conference. +@uref{http://portal.acm.org/citation.cfm?id=1267307}. + +@bibdfn{Dijkstra} +E.@: W.@: Dijkstra, @cite{The structure of the ``THE'' +multiprogramming system}. Communications of the ACM 11(5):341--346, +1968. @uref{http://doi.acm.org/10.1145/363095.363143}. + +@bibdfn{Hoare} +C.@: A.@: R.@: Hoare, @cite{Monitors: An Operating System +Structuring Concept}. Communications of the ACM, 17(10):549--557, +1974. @uref{http://www.acm.org/classics/feb96/}. + +@bibdfn{Lampson} +B.@: W.@: Lampson, D.@: D.@: Redell, @cite{Experience with processes and +monitors in Mesa}. Communications of the ACM, 23(2):105--117, 1980. +@uref{http://doi.acm.org/10.1145/358818.358824}. + +@bibdfn{McKusick} +M.@: K.@: McKusick, K.@: Bostic, M.@: J.@: Karels, J.@: S.@: Quarterman, +@cite{The Design and Implementation of the 4.4@acronym{BSD} Operating +System}. Addison-Wesley, 1996. + +@bibdfn{Wilson} +P.@: R.@: Wilson, M.@: S.@: Johnstone, M.@: Neely, D.@: Boles, +@cite{Dynamic Storage Allocation: A Survey and Critical Review}. +International Workshop on Memory Management, 1995. +@uref{http://www.cs.utexas.edu/users/oops/papers.html#allocsrv}. diff --git a/doc/codebase.texi b/doc/codebase.texi new file mode 100644 index 0000000..4415f0f --- /dev/null +++ b/doc/codebase.texi @@ -0,0 +1,634 @@ +@node Task 0--Codebase +@chapter Task 0: Alarm Clock + +This task is divided into two parts, a codebase preview and a small coding exercise. +The codebase preview has been designed to help you understand how PintOS is structured. +The exercise requires you to answer a short worksheet (handed out through Scientia) +that contains a few questions to check your understanding of the provided PintOS code. +The coding exercise has been designed to help you understand how PintOS works and is structured. +The exercise is concerned with developing a simple feature in PintOS, called Alarm Clock. + +@menu +* Task 1 Background:: +* Task 0 Requirements:: +@end menu + +@node Task 1 Background +@section Background + + +@menu +* Understanding Threads:: +* Task 1 Source Files:: +* Task 1 Synchronization:: +@end menu + +@node Understanding Threads +@subsection Understanding Threads + +The first step is to read and understand the code for the initial thread +system. +PintOS already implements thread creation and thread completion, +a simple scheduler to switch between threads, and synchronization +primitives (semaphores, locks, condition variables, and optimization +barriers). + +Some of this code might seem slightly mysterious. If +you haven't already compiled and run the base system, as described in +the introduction (@pxref{Introduction}), you should do so now. You +can read through parts of the source code to see what's going +on. If you like, you can add calls to @func{printf} almost +anywhere, then recompile and run to see what happens and in what +order. You can also run the kernel in a debugger and set breakpoints +at interesting spots, single-step through code and examine data, and +so on. + +When a thread is created, you are creating a new context to be +scheduled. You provide a function to be run in this context as an +argument to @func{thread_create}. The first time the thread is +scheduled and runs, it starts from the beginning of that function +and executes in that context. When the function returns, the thread +terminates. Each thread, therefore, acts like a mini-program running +inside PintOS, with the function passed to @func{thread_create} +acting like @func{main}. + +At any given time, exactly one thread runs and the rest, if any, +become inactive. The scheduler decides which thread to +run next. (If no thread is ready to run +at any given time, then the special ``idle'' thread, implemented in +@func{idle}, runs.) +Synchronization primitives can force context switches when one +thread needs to wait for another thread to do something. + +The mechanics of a context switch can be found in @file{threads/switch.S}, which is 80@var{x}86 assembly code. +(You don't have to understand it.) +It is enough to know that it saves the state of the currently running thread and restores the state of the thread we're switching to. + +Using the GDB debugger on the PintOS kernel (@pxref{GDB}), you can slowly trace through a context switch to see what happens in the C code. +You can set a breakpoint on @func{schedule} to start out, and then +single-step from there.@footnote{GDB might tell you that +@func{schedule} doesn't exist, which is arguably a GDB bug. +You can work around this by setting the breakpoint by filename and +line number, e.g.@: @code{break thread.c:@var{ln}} where @var{ln} is +the line number of the first declaration in @func{schedule}.} Be sure +to keep track of each thread's address +and state, and what procedures are on the call stack for each thread. +You will notice that when one thread calls @func{switch_threads}, +another thread starts running, and the first thing the new thread does +is to return from @func{switch_threads}. You will understand the thread +system once you understand why and how the @func{switch_threads} that +gets called is different from the @func{switch_threads} that returns. +@xref{Thread Switching}, for more information. + +@strong{Warning}: In PintOS, each thread is assigned a small, +fixed-size execution stack just under @w{4 kB} in size. The kernel +tries to detect stack overflow, but it cannot do so perfectly. You +may cause bizarre problems, such as mysterious kernel panics, if you +declare large data structures as non-static local variables, +e.g. @samp{int buf[1000];}. Alternatives to stack allocation include +the page allocator and the block allocator (@pxref{Memory Allocation}). + +@node Task 1 Source Files +@subsection Source Files + +Despite PintOS being a tiny operating system, the code volume can be quite discouraging at first sight. +Don't panic: the Alarm Clock exercise for task 0 will help you understand PintOS by working on a small fragment of the code. +The coding required for the later tasks will be more extensive, +but in general should still be limited to a few hundred lines over only a few files. +Here, the hope is that presenting an overview of all source files will give you a start on what +code to look at. + +@menu +* devices code:: +* thread code:: +* lib files:: +@end menu + +@node devices code +@subsubsection @file{devices} code + +The basic threaded kernel includes the following files in the +@file{devices} directory: + +@table @file +@item timer.c +@itemx timer.h +System timer that ticks, by default, 100 times per second. You will +modify this code in this task. + +@item vga.c +@itemx vga.h +VGA display driver. Responsible for writing text to the screen. +You should have no need to look at this code. @func{printf} +calls into the VGA display driver for you, so there's little reason to +call this code yourself. + +@item serial.c +@itemx serial.h +Serial port driver. Again, @func{printf} calls this code for you, +so you don't need to do so yourself. +It handles serial input by passing it to the input layer (see below). + +@item block.c +@itemx block.h +An abstraction layer for @dfn{block devices}, that is, random-access, +disk-like devices that are organized as arrays of fixed-size blocks. +Out of the box, PintOS supports two types of block devices: IDE disks +and partitions. Block devices, regardless of type, won't actually be +used until task 2. + +@item ide.c +@itemx ide.h +Supports reading and writing sectors on up to 4 IDE disks. + +@item partition.c +@itemx partition.h +Understands the structure of partitions on disks, allowing a single +disk to be carved up into multiple regions (partitions) for +independent use. + +@item kbd.c +@itemx kbd.h +Keyboard driver. Handles keystrokes passing them to the input layer +(see below). + +@item input.c +@itemx input.h +Input layer. Queues input characters passed along by the keyboard or +serial drivers. + +@item intq.c +@itemx intq.h +Interrupt queue, for managing a circular queue that both kernel +threads and interrupt handlers want to access. Used by the keyboard +and serial drivers. + +@item rtc.c +@itemx rtc.h +Real-time clock driver, to enable the kernel to determine the current +date and time. By default, this is only used by @file{thread/init.c} +to choose an initial seed for the random number generator. + +@item speaker.c +@itemx speaker.h +Driver that can produce tones on the PC speaker. + +@item pit.c +@itemx pit.h +Code to configure the 8254 Programmable Interrupt Timer. This code is +used by both @file{devices/timer.c} and @file{devices/speaker.c} +because each device uses one of the PIT's output channel. +@end table + +@node thread code +@subsubsection @file{thread} code + +Here is a brief overview of the files in the @file{threads} +directory. + +@table @file +@item loader.S +@itemx loader.h +The kernel loader. Assembles to 512 bytes of code and data that the +PC BIOS loads into memory and which in turn finds the kernel on disk, +loads it into memory, and jumps to @func{start} in @file{start.S}. +@xref{PintOS Loader}, for details. You should not need to look at +this code or modify it. + +@item start.S +Does basic setup needed for memory protection and 32-bit +operation on 80@var{x}86 CPUs. Unlike the loader, this code is +actually part of the kernel. @xref{Low-Level Kernel Initialization}, +for details. + +@item kernel.lds.S +The linker script used to link the kernel. Sets the load address of +the kernel and arranges for @file{start.S} to be near the beginning +of the kernel image. @xref{PintOS Loader}, for details. Again, you +should not need to look at this code +or modify it, but it's here in case you're curious. + +@item init.c +@itemx init.h +Kernel initialization, including @func{main}, the kernel's ``main +program.'' You should look over @func{main} at least to see what +gets initialized. You might want to add your own initialization code +here. @xref{High-Level Kernel Initialization}, for details. + +@item thread.c +@itemx thread.h +Basic thread support. @file{thread.h} defines @struct{thread}, which you are likely to modify +in all four tasks. See @ref{struct thread} and @ref{Threads} for +more information. + +@item switch.S +@itemx switch.h +Assembly language routine for switching threads. Already discussed +above. @xref{Thread Functions}, for more information. + +@item palloc.c +@itemx palloc.h +Page allocator, which hands out system memory in multiples of 4 kB +pages. @xref{Page Allocator}, for more information. + +@item malloc.c +@itemx malloc.h +A simple implementation of @func{malloc} and @func{free} for +the kernel. @xref{Block Allocator}, for more information. + +@item interrupt.c +@itemx interrupt.h +Basic interrupt handling and functions for turning interrupts on and +off. @xref{Interrupt Handling}, for more information. + +@item intr-stubs.S +@itemx intr-stubs.h +Assembly code for low-level interrupt handling. @xref{Interrupt +Infrastructure}, for more information. + +@item synch.c +@itemx synch.h +Basic synchronization primitives: semaphores, locks, condition +variables, and optimization barriers. You will need to use these for +synchronization in all +four tasks. @xref{Synchronization}, for more information. + +@item io.h +Functions for I/O port access. This is mostly used by source code in +the @file{devices} directory that you won't have to touch. + +@item vaddr.h +@itemx pte.h +Functions and macros for working with virtual addresses and page table +entries. These will be more important to you in task 3. For now, +you can ignore them. + +@item flags.h +Macros that define a few bits in the 80@var{x}86 ``flags'' register. +Probably of no interest. See @bibref{IA32-v1}, section 3.4.3, ``EFLAGS +Register,'' for more information. +@end table + + +@node lib files +@subsubsection @file{lib} files + +Finally, @file{lib} and @file{lib/kernel} contain useful library +routines. (@file{lib/user} will be used by user programs, starting in +task 2, but it is not part of the kernel.) Here's a few more +details: + +@table @file +@item ctype.h +@itemx inttypes.h +@itemx limits.h +@itemx stdarg.h +@itemx stdbool.h +@itemx stddef.h +@itemx stdint.h +@itemx stdio.c +@itemx stdio.h +@itemx stdlib.c +@itemx stdlib.h +@itemx string.c +@itemx string.h +A subset of the standard C library. @xref{C99}, for +information +on a few recently introduced pieces of the C library that you might +not have encountered before. @xref{Unsafe String Functions}, for +information on what's been intentionally left out for safety. + +@item debug.c +@itemx debug.h +Functions and macros to aid debugging. @xref{Debugging Tools}, for +more information. + +@item random.c +@itemx random.h +Pseudo-random number generator. The actual sequence of random values +may vary from one PintOS run to another. + +@item round.h +Macros for rounding. + +@item syscall-nr.h +System call numbers. Not used until task 2. + +@item kernel/list.c +@itemx kernel/list.h +Doubly linked list implementation. Used all over the PintOS code, and +you'll probably want to use it a few places yourself in task 0 and task 1. + +@item kernel/bitmap.c +@itemx kernel/bitmap.h +Bitmap implementation. You can use this in your code if you like, but +you probably won't have any need for it in task 0 or task 1. + +@item kernel/hash.c +@itemx kernel/hash.h +Hash table implementation. Likely to come in handy for task 3. + +@item kernel/console.c +@itemx kernel/console.h +@item kernel/stdio.h +Implements @func{printf} and a few other functions. +@end table + +@node Task 1 Synchronization +@subsection Synchronization + +Proper synchronization is an important part of the solutions to these +problems. Any synchronization problem can be easily solved by turning +interrupts off: while interrupts are off, there is no concurrency, so +there's no possibility for race conditions. Therefore, it's tempting to +solve all synchronization problems this way, but @strong{don't}. +Instead, use semaphores, locks, and condition variables to solve the +bulk of your synchronization problems. Read the tour section on +synchronization (@pxref{Synchronization}) or the comments in +@file{threads/synch.c} if you're unsure what synchronization primitives +may be used in what situations. + +In the PintOS tasks, the only class of problem best solved by +disabling interrupts is coordinating data shared between a kernel thread +and an interrupt handler. Because interrupt handlers can't sleep, they +can't acquire locks. This means that data shared between kernel threads +and an interrupt handler must be protected within a kernel thread by +turning off interrupts. + +This task only requires accessing a little bit of thread state from +interrupt handlers. For the alarm clock, the timer interrupt needs to +wake up sleeping threads. Later, in task 1, the advanced scheduler timer +interrupts will need to access a few global and per-thread variables. When +you access these variables from kernel threads, you will need to disable +interrupts to prevent the timer interrupts from interfering with one-another. + +When you do turn off interrupts, take care to do so for the least amount +of code possible, or you can end up losing important things such as +timer ticks or input events. Turning off interrupts also increases the +interrupt handling latency, which can make a machine feel sluggish if +taken too far. + +The synchronization primitives themselves in @file{synch.c} are +implemented by disabling interrupts. You may need to increase the +amount of code that runs with interrupts disabled here, but you should +still try to keep it to a minimum. + +Disabling interrupts can be useful for debugging, if you want to make +sure that a section of code is not interrupted. You should remove +debugging code before turning in your task. (Don't just comment it +out, because that can make the code difficult to read.) + +There should be @strong{no} busy waiting in your submission. A tight loop that +calls @func{thread_yield} is one form of busy waiting. + +@page +@node Task 0 Requirements +@section Requirements + +@menu +* Codebase Preview:: +* Alarm Clock Design Document:: +* Alarm Clock:: +* FAQ:: +@end menu + +@node Codebase Preview +@subsection Codebase Preview + +@menu +* Source Files:: +* Questions:: +@end menu + +For answering the MCQ AnswerBook test questions in the codebase preview you will be expected to have fully read: + +@itemize + +@item Section 1 +@item Section 2.1.1 and 2.1.3 +@item Sections A.2-4 +@item Sections C, D, E and F + +@end itemize + +@node Source Files +@subsubsection Source Files + +The source files you will have to fully understand: +@table @file + +@item src/threads/thread.c + Contains bulk of threading system code +@item src/threads/thread.h + Header file for threads, contains thread struct +@item src/threads/synch.c + Contains the implementation of major synchronisation primitives like + locks and semaphores +@item src/lib/kernel/list.c + Contains PintOS' list implementation +@end table + +@node Questions +@subsubsection Task 0 Questions +@include task0_questions.texi + +@node Alarm Clock Design Document +@subsection Design Document + +When you submit your work for task 0, you must also submit a completed copy of +@uref{devices.tmpl, , the task 0 design document}. +You can find a template design document for this task in @file{pintos/doc/devices.tmpl} and also on Scientia. +You must submit your design document as a @file{.pdf} file. +We recommend that you read the design document template before you start working on the task. +@xref{Task Documentation}, for a sample design document that goes along with a fictitious task. + +@node Alarm Clock +@subsection Coding the Alarm Clock + +Reimplement @func{timer_sleep}, defined in @file{devices/timer.c}. +Although a working implementation is provided, it ``busy waits,'' that +is, it spins in a loop checking the current time and calling +@func{thread_yield} until enough time has gone by. Reimplement it to +avoid busy waiting. + +@deftypefun void timer_sleep (int64_t @var{ticks}) +Suspends execution of the calling thread until time has advanced by at +least @w{@var{x} timer ticks}. Unless the system is otherwise idle, the +thread need not wake up after exactly @var{x} ticks. Just put it on +the ready queue after they have waited for the right amount of time. + +@func{timer_sleep} is useful for threads that operate in real-time, +e.g.@: for blinking the cursor once per second. + +The argument to @func{timer_sleep} is expressed in timer ticks, not in +milliseconds or any another unit. There are @code{TIMER_FREQ} timer +ticks per second, where @code{TIMER_FREQ} is a macro defined in +@code{devices/timer.h}. The default value is 100. We don't recommend +changing this value, because any change is likely to cause many of +the tests to fail. +@end deftypefun + +Separate functions @func{timer_msleep}, @func{timer_usleep}, and +@func{timer_nsleep} do exist for sleeping a specific number of +milliseconds, microseconds, or nanoseconds, respectively, but these will +call @func{timer_sleep} automatically when necessary. You do not need +to modify them. + +If your delays seem too short or too long, reread the explanation of the +@option{-r} option to @command{pintos} (@pxref{Debugging versus +Testing}). + +The alarm clock implementation is needed for Task 1, but is not needed for any later tasks. + +@node FAQ +@subsection FAQ + +@table @b +@item How much code will I need to write? + +Here's a summary of our reference solution, produced by the +@command{diffstat} program. The final row gives total lines inserted +and deleted; a changed line counts as both an insertion and a deletion. + +@verbatim + devices/timer.c | 40 ++++++++++++++++++++++++++++++++++++++-- + devices/timer.h | 9 +++++++++ + 2 files changed, 47 insertions(+), 2 deletions(-) +@end verbatim + +The reference solution represents just one possible solution. Many +other solutions are also possible and many of those differ greatly from +the reference solution. Some excellent solutions may not modify all the +files modified by the reference solution, and some may modify files not +modified by the reference solution. + +@item What does @code{warning: no previous prototype for `@var{func}'} mean? + +It means that you defined a non-@code{static} function without +preceding it by a prototype. Because non-@code{static} functions are +intended for use by other @file{.c} files, for safety they should be +prototyped in a header file included before their definition. To fix +the problem, add a prototype in a header file that you include, or, if +the function isn't actually used by other @file{.c} files, make it +@code{static}. + +@item What is the interval between timer interrupts? + +Timer interrupts occur @code{TIMER_FREQ} times per second. You can +adjust this value by editing @file{devices/timer.h}. The default is +100 Hz. + +We don't recommend changing this value, because any changes are likely +to cause many of the tests to fail. + +@item How long is a time slice? + +There are @code{TIME_SLICE} ticks per time slice. This macro is +declared in @file{threads/thread.c}. The default is 4 ticks. + +We don't recommend changing this value, because any changes are likely +to cause many of the tests to fail. + +@item How do I run the tests? + +@xref{Testing}. + +@item Why do I get a test failure in @func{pass}? + +@xref{The pass function fails}. +You are probably looking at a backtrace that looks something like this: + +@example +0xc0108810: debug_panic (lib/kernel/debug.c:32) +0xc010a99f: pass (tests/threads/tests.c:93) +0xc010bdd3: test_mlfqs_load_1 (...threads/mlfqs-load-1.c:33) +0xc010a8cf: run_test (tests/threads/tests.c:51) +0xc0100452: run_task (threads/init.c:283) +0xc0100536: run_actions (threads/init.c:333) +0xc01000bb: main (threads/init.c:137) +@end example + +This is just confusing output from the @command{backtrace} program. It +does not actually mean that @func{pass} called @func{debug_panic}. In +fact, @func{fail} called @func{debug_panic} (via the @func{PANIC} +macro). GCC knows that @func{debug_panic} does not return, because it +is declared @code{NO_RETURN} (@pxref{Function and Parameter +Attributes}), so it doesn't include any code in @func{fail} to take +control when @func{debug_panic} returns. This means that the return +address on the stack looks like it is at the beginning of the function +that happens to follow @func{fail} in memory, which in this case happens +to be @func{pass}. + +@xref{Backtraces}, for more information. + +@item How do interrupts get re-enabled in the new thread following @func{schedule}? + +Every path into @func{schedule} disables interrupts. They eventually +get re-enabled by the next thread to be scheduled. Consider the +possibilities: the new thread is running in @func{switch_thread} (but +see below), which is called by @func{schedule}, which is called by one +of a few possible functions: + +@itemize @bullet +@item +@func{thread_exit}, but we'll never switch back into such a thread, so +it's uninteresting. + +@item +@func{thread_yield}, which immediately restores the interrupt level upon +return from @func{schedule}. + +@item +@func{thread_block}, which is called from multiple places: + +@itemize @minus +@item +@func{sema_down}, which restores the interrupt level before returning. + +@item +@func{idle}, which enables interrupts with an explicit assembly STI +instruction. + +@item +@func{wait} in @file{devices/intq.c}, whose callers are responsible for +re-enabling interrupts. +@end itemize +@end itemize + +There is a special case when a newly created thread runs for the first +time. Such a thread calls @func{intr_enable} as the first action in +@func{kernel_thread}, which is at the bottom of the call stack for every +kernel thread but the first. + +@item Do I need to account for timer values overflowing? + +Don't worry about the possibility of timer values overflowing. Timer +values are expressed as signed 64-bit numbers, which at 100 ticks per +second should be good for almost 2,924,712,087 years. By then, we +expect PintOS to have been phased out of the @value{coursenumber} curriculum. + + +@item What should I expect from the Task 0 code-review? + +The code-review for this task will be conducted offline, as it would be logistically +impossible to arrange face-to-face sessions with the whole cohort. +Our Task 0 code-review will cover @strong{four} main areas: +functional correctness, efficiency, design quality and general coding style. + +@itemize @bullet +@item For @strong{functional correctness}, we will be looking to see if your solution can handle many +threads going to sleep or waking-up at the same time, without any unnecessary delays. +We will also be checking if your code for @func{timer_sleep} and @func{timer_interrupt} is free of any race conditions. + +@item For @strong{efficiency}, we will be looking at what steps you have taken to minimise the time spent +inside your timer interrupt handler. Think about how you store sleeping threads and track +how long they must sleep for. We will also be looking at your use of memory. + +@item For @strong{design quality}, we will be looking at how your have integrated your alarm-clock code with +the rest of the provided operating system. We want to see clear module boundaries and use of abstraction. + +@item For @strong{general coding style}, we will be paying attention to all of the usual elements of good style +that you should be used to from last year (e.g. consistent code layout, appropriate use of comments, avoiding magic numbers, etc.) +as well as your use of git (e.g. commit frequency and commit message quality). +@end itemize +@end table diff --git a/doc/debug.texi b/doc/debug.texi new file mode 100644 index 0000000..7bc2d62 --- /dev/null +++ b/doc/debug.texi @@ -0,0 +1,702 @@ +@node Debugging Tools +@appendix Debugging Tools + +Many tools lie at your disposal for debugging PintOS. This appendix +introduces you to a few of them. + +@menu +* printf:: +* ASSERT:: +* Function and Parameter Attributes:: +* Backtraces:: +* GDB:: +* Triple Faults:: +* Debugging Tips:: +@end menu + +@node printf +@section @code{printf()} + +Don't underestimate the value of @func{printf}. The way +@func{printf} is implemented in PintOS, you can call it from +practically anywhere in the kernel, whether it's in a kernel thread or +an interrupt handler, almost regardless of what locks are held. + +@func{printf} is useful for more than just examining data. +It can also help figure out when and where something goes wrong, even +when the kernel crashes or panics without a useful error message. The +strategy is to sprinkle calls to @func{printf} with different strings +(e.g.@: @code{"<1>"}, @code{"<2>"}, @dots{}) throughout the pieces of +code you suspect are failing. If you don't even see @code{<1>} printed, +then something bad happened before that point, if you see @code{<1>} +but not @code{<2>}, then something bad happened between those two +points, and so on. Based on what you learn, you can then insert more +@func{printf} calls in the new, smaller region of code you suspect. +Eventually you can narrow the problem down to a single statement. +@xref{Triple Faults}, for a related technique. + +@node ASSERT +@section @code{ASSERT} + +Assertions are useful because they can catch problems early, before +they'd otherwise be noticed. Ideally, each function should begin with a +set of assertions that check its arguments for validity. (Initializers +for functions' local variables are evaluated before assertions are +checked, so be careful not to assume that an argument is valid in an +initializer.) You can also sprinkle assertions throughout the body of +functions in places where you suspect things are likely to go wrong. +They are especially useful for checking loop invariants. + +PintOS provides the @code{ASSERT} macro, defined in @file{}, +for checking assertions. + +@defmac ASSERT (expression) +Tests the value of @var{expression}. If it evaluates to zero (false), +the kernel panics. The panic message includes the expression that +failed, its file and line number, and a backtrace, which should help you +to find the problem. @xref{Backtraces}, for more information. +@end defmac + +@node Function and Parameter Attributes +@section Function and Parameter Attributes + +These macros defined in @file{} tell the compiler special +attributes of a function or function parameter. Their expansions are +GCC-specific. + +@defmac UNUSED +Appended to a function parameter to tell the compiler that the +parameter might not be used within the function. It suppresses the +warning that would otherwise appear. +@end defmac + +@defmac NO_RETURN +Appended to a function prototype to tell the compiler that the +function never returns. It allows the compiler to fine-tune its +warnings and its code generation. +@end defmac + +@defmac NO_INLINE +Appended to a function prototype to tell the compiler to never emit +the function in-line. Occasionally useful to improve the quality of +backtraces (see below). +@end defmac + +@defmac PRINTF_FORMAT (@var{format}, @var{first}) +Appended to a function prototype to tell the compiler that the function +takes a @func{printf}-like format string as the argument numbered +@var{format} (starting from 1) and that the corresponding value +arguments start at the argument numbered @var{first}. This lets the +compiler tell you if you pass the wrong argument types. +@end defmac + +@node Backtraces +@section Backtraces + +When the kernel panics, it prints a ``backtrace,'' that is, a summary +of how your program got where it is, as a list of addresses inside the +functions that were running at the time of the panic. You can also +insert a call to @func{debug_backtrace}, prototyped in +@file{}, to print a backtrace at any point in your code. +@func{debug_backtrace_all}, also declared in @file{}, +prints backtraces of all threads. + +The addresses in a backtrace are listed as raw hexadecimal numbers, +which are difficult to interpret. We provide a tool called +@command{backtrace} to translate these into function names and source +file line numbers. +Give it the name of your @file{kernel.o} as the first argument and the +hexadecimal numbers composing the backtrace (including the @samp{0x} +prefixes) as the remaining arguments. It outputs the function name +and source file line numbers that correspond to each address. + +If the translated form of a backtrace is garbled, or doesn't make +sense (e.g.@: function A is listed above function B, but B doesn't +call A), then it's a good sign that you're corrupting a kernel +thread's stack, because the backtrace is extracted from the stack. +Alternatively, it could be that the @file{kernel.o} you passed to +@command{backtrace} is not the same kernel that produced +the backtrace. + +Sometimes backtraces can be confusing without any corruption. +Compiler optimizations can cause surprising behaviour. When a function +has called another function as its final action (a @dfn{tail call}), the +calling function may not appear in a backtrace at all. Similarly, when +function A calls another function B that never returns, the compiler may +optimize such that an unrelated function C appears in the backtrace +instead of A. Function C is simply the function that happens to be in +memory just after A. In the threads task, this is commonly seen in +backtraces for test failures; see @ref{The pass function fails, , +@func{pass} fails}, for more information. + +@menu +* Backtrace Example:: +@end menu + +@node Backtrace Example +@subsection Example + +Here's an example. Suppose that PintOS printed out this following call +stack, which is taken from an actual PintOS submission: + +@example +Call stack: 0xc0106eff 0xc01102fb 0xc010dc22 0xc010cf67 0xc0102319 +0xc010325a 0x804812c 0x8048a96 0x8048ac8. +@end example + +You would then invoke the @command{backtrace} utility like shown below, +cutting and pasting the backtrace information into the command line. +This assumes that @file{kernel.o} is in the current directory. You +would of course enter all of the following on a single shell command +line, even though that would overflow our margins here: + +@example +backtrace kernel.o 0xc0106eff 0xc01102fb 0xc010dc22 0xc010cf67 +0xc0102319 0xc010325a 0x804812c 0x8048a96 0x8048ac8 +@end example + +The backtrace output would then look something like this: + +@example +0xc0106eff: debug_panic (lib/debug.c:86) +0xc01102fb: file_seek (filesys/file.c:405) +0xc010dc22: seek (userprog/syscall.c:744) +0xc010cf67: syscall_handler (userprog/syscall.c:444) +0xc0102319: intr_handler (threads/interrupt.c:334) +0xc010325a: intr_entry (threads/intr-stubs.S:38) +0x0804812c: (unknown) +0x08048a96: (unknown) +0x08048ac8: (unknown) +@end example + +(You will probably not see exactly the same addresses if you run the +command above on your own kernel binary, because the source code you +compiled and the compiler you used are probably different.) + +The first line in the backtrace refers to @func{debug_panic}, the +function that implements kernel panics. Because backtraces commonly +result from kernel panics, @func{debug_panic} will often be the first +function shown in a backtrace. + +The second line shows @func{file_seek} as the function that panicked, +in this case as the result of an assertion failure. In the source code +tree used for this example, line 405 of @file{filesys/file.c} is the +assertion + +@example +ASSERT (file_ofs >= 0); +@end example + +@noindent +(This line was also cited in the assertion failure message.) +Thus, @func{file_seek} panicked because it passed a negative file offset +argument. + +The third line indicates that @func{seek} called @func{file_seek}, +presumably without validating the offset argument. In this submission, +@func{seek} implements the @code{seek} system call. + +The fourth line shows that @func{syscall_handler}, the system call +handler, invoked @func{seek}. + +The fifth and sixth lines are the interrupt handler entry path. + +The remaining lines are for addresses below @code{PHYS_BASE}. This +means that they refer to addresses in the user program, not in the +kernel. If you know what user program was running when the kernel +panicked, you can re-run @command{backtrace} on the user program, like +so: (typing the command on a single line, of course): + +@example +backtrace tests/filesys/extended/grow-too-big 0xc0106eff 0xc01102fb +0xc010dc22 0xc010cf67 0xc0102319 0xc010325a 0x804812c 0x8048a96 +0x8048ac8 +@end example + +The results look like this: + +@example +0xc0106eff: (unknown) +0xc01102fb: (unknown) +0xc010dc22: (unknown) +0xc010cf67: (unknown) +0xc0102319: (unknown) +0xc010325a: (unknown) +0x0804812c: test_main (...xtended/grow-too-big.c:20) +0x08048a96: main (tests/main.c:10) +0x08048ac8: _start (lib/user/entry.c:9) +@end example + +You can even specify both the kernel and the user program names on +the command line, like so: + +@example +backtrace kernel.o tests/filesys/extended/grow-too-big 0xc0106eff +0xc01102fb 0xc010dc22 0xc010cf67 0xc0102319 0xc010325a 0x804812c +0x8048a96 0x8048ac8 +@end example + +The result is a combined backtrace: + +@example +In kernel.o: +0xc0106eff: debug_panic (lib/debug.c:86) +0xc01102fb: file_seek (filesys/file.c:405) +0xc010dc22: seek (userprog/syscall.c:744) +0xc010cf67: syscall_handler (userprog/syscall.c:444) +0xc0102319: intr_handler (threads/interrupt.c:334) +0xc010325a: intr_entry (threads/intr-stubs.S:38) +In tests/filesys/extended/grow-too-big: +0x0804812c: test_main (...xtended/grow-too-big.c:20) +0x08048a96: main (tests/main.c:10) +0x08048ac8: _start (lib/user/entry.c:9) +@end example + +Here's an extra tip for anyone who read this far: @command{backtrace} +is smart enough to strip the @code{Call stack:} header and @samp{.} +trailer from the command line if you include them. This can save you +a little bit of trouble in cutting and pasting. Thus, the following +command prints the same output as the first one we used: + +@example +backtrace kernel.o Call stack: 0xc0106eff 0xc01102fb 0xc010dc22 +0xc010cf67 0xc0102319 0xc010325a 0x804812c 0x8048a96 0x8048ac8. +@end example + +@node GDB +@section GDB + +You can run PintOS under the supervision of the GDB debugger. +First, start PintOS with the @option{--gdb} option, e.g.@: +@command{pintos --gdb -- run mytest}. Second, open a second terminal on +the same machine and +use @command{pintos-gdb} to invoke GDB on +@file{kernel.o}:@footnote{@command{pintos-gdb} is a wrapper around +@command{gdb} (80@var{x}86) that loads the PintOS macros at startup.} +@example +pintos-gdb kernel.o +@end example +@noindent and issue the following GDB command: +@example +target remote localhost:1234 +@end example +@noindent or alternatively issue the following GDB macro: +@example +debugpintos +@end example + +Now GDB is connected to the simulator over a local +network connection. You can now issue any normal GDB +commands. If you issue the @samp{c} command, the simulated BIOS will take +control, load PintOS, and then PintOS will run in the usual way. You +can pause the process at any point with @key{Ctrl+C}. + +@menu +* Using GDB:: +* Example GDB Session:: +* GDB FAQ:: +@end menu + +@node Using GDB +@subsection Using GDB + +You can read the GDB manual by typing @code{info gdb} at a +terminal command prompt. Here's a few commonly useful GDB commands: + +@deffn {GDB Command} c +Continues execution until @key{Ctrl+C} or the next breakpoint. +@end deffn + +@deffn {GDB Command} break function +@deffnx {GDB Command} break file:line +@deffnx {GDB Command} break *address +Sets a breakpoint at @var{function}, at @var{line} within @var{file}, or +@var{address}. +(Use a @samp{0x} prefix to specify an address in hex.) + +Use @code{break main} to make GDB stop when PintOS starts running. +@end deffn + +@deffn {GDB Command} p expression +Evaluates the given @var{expression} and prints its value. +If the expression contains a function call, that function will actually +be executed. +@end deffn + +@deffn {GDB Command} l *address +Lists a few lines of code around @var{address}. +(Use a @samp{0x} prefix to specify an address in hex.) +@end deffn + +@deffn {GDB Command} bt +Prints a stack backtrace similar to that output by the +@command{backtrace} program described above. +@end deffn + +@deffn {GDB Command} p/a address +Prints the name of the function or variable that occupies @var{address}. +(Use a @samp{0x} prefix to specify an address in hex.) +@end deffn + +@deffn {GDB Command} diassemble function +Disassembles @var{function}. +@end deffn + +We also provide a set of macros specialized for debugging PintOS, +written by Godmar Back @email{gback@@cs.vt.edu}. You can type +@code{help user-defined} for basic help with the macros. Here is an +overview of their functionality, based on Godmar's documentation: + +@deffn {GDB Macro} debugpintos +Attach debugger to a waiting pintos process on the same machine. +Shorthand for @code{target remote localhost:1234}. +@end deffn + +@deffn {GDB Macro} dumplist list type element +Prints the elements of @var{list}, which must be passed by reference and should be a @code{struct list} +that contains elements of the given @var{type} (without the word +@code{struct}) in which @var{element} is the @struct{list_elem} member +that links the elements. + +Example: @code{dumplist &all_list thread allelem} prints all elements of +@struct{thread} that are linked in @code{struct list all_list} using the +@code{struct list_elem allelem} which is part of @struct{thread}. +@end deffn + +@deffn {GDB Macro} dumphash hash type element +Similar to @code{dumplist}. Prints the elements of @var{hash}, which must be passed by reference and should be a @code{struct hash} +that contains elements of the given @var{type} (without the word +@code{struct}) in which @var{element} is the @struct{hash_elem} member +that links the elements. +@end deffn + +@deffn {GDB Macro} btthread thread +Shows the backtrace of @var{thread}, which is a pointer to the +@struct{thread} of the thread whose backtrace it should show. For the +current thread, this is identical to the @code{bt} (backtrace) command. +It also works for any thread suspended in @func{schedule}, +provided you know where its kernel stack page is located. +@end deffn + +@deffn {GDB Macro} btthreadlist list element +Shows the backtraces of all threads in @var{list}, which must be passed by reference and is the @struct{list} in which the threads are kept. +Specify @var{element} as the @struct{list_elem} field used inside @struct{thread} to link the threads together. + +Example: @code{btthreadlist &all_list allelem} shows the backtraces of +all threads contained in @code{struct list all_list}, linked together by +@code{allelem}. This command is useful to determine where your threads +are stuck when a deadlock occurs. Please see the example scenario below. +@end deffn + +@deffn {GDB Macro} btthreadall +Short-hand for @code{btthreadlist all_list allelem}. +@end deffn + +@deffn {GDB Macro} hook-stop +GDB invokes this macro every time the simulation stops, which QEMU will +do for every processor exception, among other reasons. If the +simulation stops due to a page fault, @code{hook-stop} will print a +message that says and explains further whether the page fault occurred +in the kernel or in user code. + +If the exception occurred from user code, @code{hook-stop} will say: +@example +pintos-debug: a page fault exception occurred in user mode +pintos-debug: hit 'c' to continue, or 's' to step to intr_handler +@end example + +In Task 2, a page fault in a user process leads to the termination of +the process. You should expect those page faults to occur in the +robustness tests where we test that your kernel properly terminates +processes that try to access invalid addresses. To debug those, set a +break point in @func{page_fault} in @file{exception.c}, which you will +need to modify accordingly. + +In Task 3, a page fault in a user process no longer automatically +leads to the termination of a process. Instead, it may require reading in +data for the page the process was trying to access, either +because it was swapped out or because this is the first time it's +accessed. In either case, you will reach @func{page_fault} and need to +take the appropriate action there. + +If the page fault did not occur in user mode while executing a user +process, then it occurred in kernel mode while executing kernel code. +In this case, @code{hook-stop} will print this message: +@example +pintos-debug: a page fault occurred in kernel mode +@end example + +Before Task 3, a page fault exception in kernel code is always a bug +in your kernel, because your kernel should never crash. Starting with +Task 3, the situation will change if you use the @func{get_user} and +@func{put_user} strategy to verify user memory accesses +(@pxref{Accessing User Memory}). + +@c ---- +@c Unfortunately, this does not work with Bochs's gdb stub. +@c ---- +@c If you don't want GDB to stop for page faults, then issue the command +@c @code{handle SIGSEGV nostop}. GDB will still print a message for +@c every page fault, but it will not come back to a command prompt. +@end deffn + +@node Example GDB Session +@subsection Example GDB Session + +This section narrates a sample GDB session, provided by Godmar Back +(modified by Mark Rutland and Feroz Abdul Salam, and updated by Fidelis Perkonigg). +This example illustrates how one might debug a Task 1 solution in +which occasionally a thread that calls @func{timer_sleep} is not woken +up. With this bug, tests such as @code{mlfqs_load_1} get stuck. + +Program output is shown in normal type, user input in @strong{strong} +type. + +@noindent First, we start PintOS using the QEMU emulator: + +@smallexample +@code{$ pintos -v --qemu --gdb -- -q -mlfqs run mlfqs-load-1} + +qemu-system-i386 -drive file=/tmp/GKWoGG8QE6.dsk,index=0,media=disk,format=raw -m 4 -net none -nographic -s -S +@end smallexample + +@noindent This starts QEMU but pauses the execution of PintOS immediately to +allow us to attach GDB to PintOS. We open a second window in the same directory +on the same machine and start GDB: + +@smallexample +$ @strong{pintos-gdb kernel.o} +GNU gdb (Ubuntu 9.2-0ubuntu1~20.04.1) 9.2 +Copyright (C) 2020 Free Software Foundation, Inc. +License GPLv3+: GNU GPL version 3 or later +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. +Type "show copying" and "show warranty" for details. +This GDB was configured as "x86_64-linux-gnu". +... +For help, type "help". +Type "apropos word" to search for commands related to "word"... +Reading symbols from kernel.o...done. +The target architecture is assumed to be i386 +@end smallexample + +@noindent Then, we tell GDB to attach to the waiting PintOS emulator: + +@smallexample +(gdb) @strong{debugpintos} +0x0000fff0 in ?? () +@end smallexample + +@noindent Now we instruct GDB to continue the execution of PintOS by using the +command @code{continue} (or the abbreviation @code{c}): + +@smallexample +(gdb) @strong{c} +Continuing. +@end smallexample + +@noindent Now PintOS will continue and output: + +@smallexample +PiLo hda1 +Loading.......... +Kernel command line: -q -mlfqs run mlfqs-load-1 +PintOS booting with 3,968 kB RAM... +367 pages available in kernel pool. +367 pages available in user pool. +Calibrating timer... 838,041,600 loops/s. +Boot complete. +Executing 'mlfqs-load-1': +(mlfqs-load-1) begin +(mlfqs-load-1) spinning for up to 45 seconds, please wait... +@end smallexample + +@noindent +... until it gets stuck due to the bug in the code. +We hit @key{Ctrl+C} in the debugger window to stop PintOS. + +@smallexample +Program received signal SIGINT, Interrupt. +intr_get_level () at ../../threads/interrupt.c:66 +(gdb) +@end smallexample + +@noindent +The thread that was running when we stopped PintOS happened to be the main +thread. If we run @code{backtrace}, it shows this backtrace: + +@smallexample +(gdb) @strong{bt} +#0 intr_get_level () at ../../threads/interrupt.c:66 +#1 0xc0021103 in intr_enable () at ../../threads/interrupt.c:90 +#2 0xc0021150 in intr_set_level (level=INTR_ON) at ../../threads/interrupt.c:83 +#3 0xc0023422 in timer_ticks () at ../../devices/timer.c:75 +#4 0xc002343d in timer_elapsed (then=23) at ../../devices/timer.c:84 +#5 0xc002aabf in test_mlfqs_load_1 () at ../../tests/threads/mlfqs-load-1.c:33 +#6 0xc002b610 in run_test (name=0xc0007d4c "mlfqs-load-1") at ../../tests/devices/tests.c:72 +#7 0xc00201a2 in run_task (argv=0xc00349e8 ) at ../../threads/init.c:290 +#8 0xc0020687 in run_actions (argv=0xc00349e8 ) at ../../threads/init.c:340 +#9 main () at ../../threads/init.c:133 +@end smallexample + +@noindent +Not terribly useful. What we really like to know is what's up with the +other thread (or threads). Since we keep all threads in a linked list +called @code{all_list}, linked together by a @struct{list_elem} member +named @code{allelem}, we can use the @code{btthreadlist} macro. +@code{btthreadlist} iterates through the list of threads and prints the +backtrace for each thread: + +@smallexample +(gdb) @strong{btthreadlist &all_list allelem} +pintos-debug: dumping backtrace of thread 'main' @@0xc000e000 +#0 intr_get_level () at ../../threads/interrupt.c:66 +#1 0xc0021103 in intr_enable () at ../../threads/interrupt.c:90 +#2 0xc0021150 in intr_set_level (level=INTR_ON) at ../../threads/interrupt.c:83 +#3 0xc0023422 in timer_ticks () at ../../devices/timer.c:75 +#4 0xc002343d in timer_elapsed (then=23) at ../../devices/timer.c:84 +#5 0xc002aabf in test_mlfqs_load_1 () at ../../tests/threads/mlfqs-load-1.c:33 +#6 0xc002b610 in run_test (name=0xc0007d4c "mlfqs-load-1") at ../../tests/devices/tests.c:72 +#7 0xc00201a2 in run_task (argv=0xc00349e8 ) at ../../threads/init.c:290 +#8 0xc0020687 in run_actions (argv=0xc00349e8 ) at ../../threads/init.c:340 +#9 main () at ../../threads/init.c:133 + +pintos-debug: dumping backtrace of thread 'idle' @@0xc0103000 +#0 0xc0020dc5 in schedule () at ../../threads/thread.c:579 +#1 0xc0020e01 in thread_block () at ../../threads/thread.c:235 +#2 0xc0020e6d in idle (idle_started_=0xc000ef7c) at ../../threads/thread.c:414 +#3 0xc0020efc in kernel_thread (function=0xc0020e45 , aux=0xc000ef7c) + at ../../threads/thread.c:439 +#4 0x00000000 in ?? () +@end smallexample + +@noindent +In this case, there are only two threads, the main thread and the idle +thread. The kernel stack pages (to which the @struct{thread} points) +are at @t{0xc000e000} and @t{0xc0103000}, respectively. The main thread +was in @func{timer_elapsed}, called from @code{test_mlfqs_load_1} when stopped. + +Knowing where threads are can be tremendously useful, for instance +when diagnosing deadlocks or unexplained hangs. + +@deffn {GDB Macro} loadusersymbols + +You can also use GDB to debug a user program running under PintOS. +To do that, use the @code{loadusersymbols} macro to load the program's +symbol table: +@example +loadusersymbols @var{program} +@end example +@noindent +where @var{program} is the name of the program's executable (in the host +file system, not in the PintOS file system). For example, you may issue: +@smallexample +(gdb) @strong{loadusersymbols tests/userprog/exec-multiple} +add symbol table from file "tests/userprog/exec-multiple" at + .text_addr = 0x80480a0 +(gdb) +@end smallexample + +After this, you should be +able to debug the user program the same way you would the kernel, by +placing breakpoints, inspecting data, etc. Your actions apply to every +user program running in PintOS, not just to the one you want to debug, +so be careful in interpreting the results: GDB does not know +which process is currently active (because that is an abstraction +the PintOS kernel creates). Also, a name that appears in +both the kernel and the user program will actually refer to the kernel +name. (The latter problem can be avoided by giving the user executable +name on the GDB command line, instead of @file{kernel.o}, and then using +@code{loadusersymbols} to load @file{kernel.o}.) +@code{loadusersymbols} is implemented via GDB's @code{add-symbol-file} +command. + +@end deffn + +@node GDB FAQ +@subsection FAQ + +@table @asis +@item GDB can't connect to QEMU (Error: localhost:1234: Connection refused) + +If the @command{target remote} command fails, then make sure that both +GDB and @command{pintos} are running on the same machine by +running @command{hostname} in each terminal. If the names printed +differ, then you need to open a new terminal for GDB on the +machine running @command{pintos}. + +@item GDB doesn't recognize any of the macros. + +If you start GDB with @command{pintos-gdb}, it should load the PintOS +macros automatically. If you start GDB some other way, then you must +issue the command @code{source @var{pintosdir}/src/misc/gdb-macros}, +where @var{pintosdir} is the root of your PintOS directory, before you +can use them. + +@item Can I debug PintOS with DDD? + +Yes, you can. DDD invokes GDB as a subprocess, so you'll need to tell +it to invokes @command{pintos-gdb} instead: +@example +ddd --gdb --debugger pintos-gdb +@end example + +@item Can I use GDB inside Emacs? + +Yes, you can. Emacs has special support for running GDB as a +subprocess. Type @kbd{M-x gdb} and enter your @command{pintos-gdb} +command at the prompt. The Emacs manual has information on how to use +its debugging features in a section titled ``Debuggers.'' + +@end table + +@node Triple Faults +@section Triple Faults + +When a CPU exception handler, such as a page fault handler, cannot be +invoked because it is missing or defective, the CPU will try to invoke +the ``double fault'' handler. If the double fault handler is itself +missing or defective, that's called a ``triple fault.'' A triple fault +causes an immediate CPU reset. + +Thus, if you get yourself into a situation where the machine reboots in +a loop, that's probably a ``triple fault.'' In a triple fault +situation, you might not be able to use @func{printf} for debugging, +because the reboots might be happening even before everything needed for +@func{printf} is initialized. + +Currently, the only option is ``debugging by infinite loop.'' +Pick a place in the PintOS code, insert the infinite loop +@code{for (;;);} there, and recompile and run. There are two likely +possibilities: + +@itemize @bullet +@item +The machine hangs without rebooting. If this happens, you know that +the infinite loop is running. That means that whatever caused the +reboot must be @emph{after} the place you inserted the infinite loop. +Now move the infinite loop later in the code sequence. + +@item +The machine reboots in a loop. If this happens, you know that the +machine didn't make it to the infinite loop. Thus, whatever caused the +reboot must be @emph{before} the place you inserted the infinite loop. +Now move the infinite loop earlier in the code sequence. +@end itemize + +If you move around the infinite loop in a ``binary search'' fashion, you +can use this technique to pin down the exact spot that everything goes +wrong. It should only take a few minutes at most. + +@node Debugging Tips +@section Tips + +The page allocator in @file{threads/palloc.c} and the block allocator in +@file{threads/malloc.c} clear all the bytes in memory to +@t{0xcc} at time of free. Thus, if you see an attempt to +dereference a pointer like @t{0xcccccccc}, or some other reference to +@t{0xcc}, there's a good chance you're trying to reuse a page that's +already been freed. Also, byte @t{0xcc} is the CPU opcode for ``invoke +interrupt 3,'' so if you see an error like @code{Interrupt 0x03 (#BP +Breakpoint Exception)}, then PintOS tried to execute code in a freed page or +block. diff --git a/doc/devel.texi b/doc/devel.texi new file mode 100644 index 0000000..41f5c29 --- /dev/null +++ b/doc/devel.texi @@ -0,0 +1,108 @@ +@node Development Tools +@appendix Development Tools + +Here are some tools that you might find useful while developing code. + +@menu +* Tags:: +* cscope:: +* Git:: +@ifset recommendvnc +* VNC:: +@end ifset +@ifset recommendcygwin +* Cygwin:: +@end ifset +@end menu + +@node Tags +@section Tags + +Tags are an index to the functions and global variables declared in a +program. Many editors, including Emacs and @command{vi}, can use +them. The @file{Makefile} in @file{pintos-ic/src} produces Emacs-style +tags with the command @code{make TAGS} or @command{vi}-style tags with +@code{make tags}. + +In Emacs, use @kbd{M-.} to follow a tag in the current window, +@kbd{C-x 4 .} in a new window, or @kbd{C-x 5 .} in a new frame. If +your cursor is on a symbol name for any of those commands, it becomes +the default target. If a tag name has multiple definitions, @kbd{M-0 +M-.} jumps to the next one. To jump back to where you were before +you followed the last tag, use @kbd{M-*}. + +@node cscope +@section cscope + +The @command{cscope} program also provides an index to functions and +variables declared in a program. It has some features that tag +facilities lack. Most notably, it can find all the points in a +program at which a given function is called. + +The @file{Makefile} in @file{pintos-ic/src} produces @command{cscope} +indexes when it is invoked as @code{make cscope}. Once the index has +been generated, run @command{cscope} from a shell command line; no +command-line arguments are normally necessary. Then use the arrow +keys to choose one of the search criteria listed near the bottom of +the terminal, type in an identifier, and hit @key{Enter}. +@command{cscope} will then display the matches in the upper part of +the terminal. You may use the arrow keys to choose a particular +match; if you then hit @key{Enter}, @command{cscope} will invoke the +default system editor@footnote{This is typically @command{vi}. To +exit @command{vi}, type @kbd{: q @key{Enter}}.} and position the +cursor on that match. To start a new search, type @key{Tab}. To exit +@command{cscope}, type @kbd{Ctrl-d}. + +Emacs and some versions of @command{vi} have their own interfaces to +@command{cscope}. For information on how to use these interface, +visit @url{http://cscope.sourceforge.net, the @command{cscope} home +page}. + +@node Git +@section Git + +Git is a version-control system. That is, you can use it to keep +track of multiple versions of files. The idea is that you do some +work on your code and test it, then commit it into the version-control +system. If you decide that the work you've done since your last +commit is no good, you can easily revert to the last version. +Furthermore, you can retrieve any old version of your code +as of some given day and time. The version control logs tell you who +made changes and when. + +Whilst Git may not be everyone's preferred version control system, it's +free, has a wealth of documentation, and is easy to install on most +Unix-like environments. + +For more information, visit the @uref{https://www.git-scm.com/, , Git +home page}. + +@include localgitinstructions.texi + +@ifset recommendvnc +@node VNC +@section VNC + +VNC stands for Virtual Network Computing. It is, in essence, a remote +display system which allows you to view a computing ``desktop'' +environment not only on the machine where it is running, but from +anywhere on the Internet and from a wide variety of machine +architectures. It is already installed on the lab machines. +For more information, look at the @uref{http://www.realvnc.com/, , VNC +Home Page}. +@end ifset + +@ifset recommendcygwin +@node Cygwin +@section Cygwin + +@uref{http://cygwin.com/, ,Cygwin} provides a Linux-compatible environment +for Windows. It includes ssh client and an X11 server, Cygwin/X. If your +primary work environment is Windows, you will find Cygwin/X extremely +useful for these tasks. Install Cygwin/X, then start the X server +and open a new xterm. The X11 server also allows you to run pintos while +displaying the qemu-emulated console on your Windows desktop. +@end ifset + +@localdevelopmenttools{} + diff --git a/doc/devices.tmpl b/doc/devices.tmpl new file mode 100644 index 0000000..eb11a55 --- /dev/null +++ b/doc/devices.tmpl @@ -0,0 +1,51 @@ + +----------------------+ + | OS 211 | + | TASK 0: ALARMCLOCK | + | DESIGN DOCUMENT | + +----------------------+ + + +---- PRELIMINARIES ---- + +>> If you have any preliminary comments on your submission, or notes for the +>> markers, please give them here. + +>> Please cite any offline or online sources you consulted while preparing your +>> submission, other than the Pintos documentation, course text, lecture notes +>> and course staff. + + ALARM CLOCK + =========== + +---- DATA STRUCTURES ---- + +>> A1: (2 marks) +>> Copy here the declaration of each new or changed `struct' or `struct' member, +>> global or static variable, `typedef', or enumeration. +>> Identify the purpose of each in roughly 25 words. + +---- ALGORITHMS ---- + +>> A2: (2 marks) +>> Briefly describe what happens in a call to timer_sleep(), including the +>> actions performed by the timer interrupt handler on each timer tick. + +>> A3: (2 marks) +>> What steps are taken to minimize the amount of time spent in the timer +>> interrupt handler? + +---- SYNCHRONIZATION ---- + +>> A4: (1 mark) +>> How are race conditions avoided when multiple threads call timer_sleep() +>> simultaneously? + +>> A5: (1 mark) +>> How are race conditions avoided when a timer interrupt occurs during a call +>> to timer_sleep()? + +---- RATIONALE ---- + +>> A6: (2 marks) +>> Why did you choose this design? +>> In what ways is it superior to another design you considered? diff --git a/doc/doc.texi b/doc/doc.texi new file mode 100644 index 0000000..aba268d --- /dev/null +++ b/doc/doc.texi @@ -0,0 +1,59 @@ +@node Task Documentation +@appendix Task Documentation + +This chapter presents a sample assignment and a filled-in design +document for one possible implementation. Its purpose is to give you an +idea of what we expect to see in your own design documents. + +@menu +* Sample Assignment:: +* Sample Design Document:: +@end menu + +@node Sample Assignment +@section Sample Assignment + +Implement @func{thread_join}. + +@deftypefun void thread_join (tid_t @var{tid}) +Blocks the current thread until thread @var{tid} exits. If @var{A} is +the running thread and @var{B} is the argument, then we say that +``@var{A} joins @var{B}.'' + +Incidentally, the argument is a thread id, instead of a thread pointer, +because a thread pointer is not unique over time. That is, when a +thread dies, its memory may be, whether immediately or much later, +reused for another thread. If thread @var{A} over time had two children +@var{B} and @var{C} that were stored at the same address, then +@code{thread_join(@var{B})} and @code{thread_join(@var{C})} would be +ambiguous. + +A thread may only join its immediate children. Calling +@func{thread_join} on a thread that is not the caller's child should +cause the caller to return immediately. Children are not ``inherited,'' +that is, if @var{A} has child @var{B} and @var{B} has child @var{C}, +then @var{A} always returns immediately should it try to join @var{C}, +even if @var{B} is dead. + +A thread need not ever be joined. Your solution should properly free +all of a thread's resources, including its @struct{thread}, +whether it is ever joined or not, and regardless of whether the child +exits before or after its parent. That is, a thread should be freed +exactly once in all cases. + +Joining a given thread is idempotent. That is, joining a thread +multiple times is equivalent to joining it once, because it has already +exited at the time of the later joins. Thus, joins on a given thread +after the first should return immediately. + +You must handle all the ways a join can occur: nested joins (@var{A} +joins @var{B}, then @var{B} joins @var{C}), multiple joins (@var{A} +joins @var{B}, then @var{A} joins @var{C}), and so on. +@end deftypefun + +@node Sample Design Document +@section Sample Design Document + +@example +@include sample.tmpl.texi +@end example diff --git a/doc/installation.texi b/doc/installation.texi new file mode 100644 index 0000000..5ed8d19 --- /dev/null +++ b/doc/installation.texi @@ -0,0 +1,157 @@ +@node Installing PintOS +@appendix Installing PintOS + +This chapter explains how to install a PintOS development environment on your own machine. +We assume that you have already cloned your pintos git repo onto your machine. +If you are using a PintOS development environment that has been set up by someone else, +you should not need to read this chapter or follow any of these instructions. + +The PintOS development environment is targeted at Unix-like systems. +It has been most extensively tested on GNU/Linux, in particular the Debian and Ubuntu distributions, and Solaris. +It is not designed to install under any form of Windows. + +@menu +* Mac Specific Initial Set-up:: +* Prerequisites:: +* Installation:: +@end menu + +@node Mac Specific Initial Set-up +@section Mac Specific Initial Set-up + +This first section is intended to help Mac users prepare to set-up PintOS so that they can coexist with LabTS and your Linux-using friends, +without any on-going hassle. +If you are not attempting to install PintOS on a Mac, then please skip ahead to the next section. + +To prepare your Mac for PintOS, you will need to preform the following initial set-up steps: + +@itemize +@item Download and unpack a prepared selection of cross-compiled GCC binaries from: +@uref{https://www.doc.ic.ac.uk/~mjw03/OSLab/mac-i686-elf-gcc-binaries.tar}.@* +You can also install these binaries onto your Mac yourself if you prefer. + +@item Add the unpacked GCC binaries to your path with a line like:@* +@code{export PATH=$PATH:/your/local/path/here/mac-i686-elf-gcc-binaries/bin} + +@end itemize +You should now be ready to follow the remaining instructions in this appendix. + +@node Prerequisites +@section Prerequisites + +Before attempting to install a PintOS development environment, you should check that the following prerequisites, +on top of standard Unix utilities, are available on your system: + +@itemize @bullet +@item +@strong{Required:} @uref{http://gcc.gnu.org/, GCC}. +Version 5.4 or later is preferred. +Version 4.0 or later should work. +If the host machine has an 80@var{x}86 processor (32-bit or 64-bit), then GCC should be available via the command @command{gcc}; +otherwise, an 80@var{x}86 cross-compiler should be available via the command @command{i386-elf-gcc}. +If you need a GCC cross-compiler, but one is not already installed on your system, then you will need to search online for an up-to-date installation guide. + +@item +@strong{Required:} @uref{http://www.gnu.org/software/binutils/, GNU binutils}. +PintOS uses the Unix utilities @command{addr2line}, @command{ar}, @command{ld}, @command{objcopy}, and @command{ranlib}. +If the host machine does not have an 80@var{x}86 processor, then versions targeting 80@var{x}86 should be available to install with an @samp{i386-elf-} prefix. + +@item +@strong{Required:} @uref{http://www.perl.org, Perl}. +Version 5.20.0 or later is preferred. +Version 5.6.1 or later should work. + +@item +@strong{Required:} @uref{http://www.gnu.org/software/make/, GNU make}. +Version 4.0 or later is preferred. +Version 3.80 or later should work. + +@item +@strong{Required:} @uref{http://fabrice.bellard.free.fr/qemu/, QEMU}. +The QEMU emulator required to run PintOS is @command{qemu-system-i386} which is part of the @command{qemu-system} package on most modern Unix platforms. +We recommend using version 2.10 or later, but at least version 2.5. + +@item +@strong{Recommended:} @uref{http://www.gnu.org/software/gdb/, GDB}. +GDB is helpful in debugging (@pxref{GDB}). +If the host machine is not an 80@var{x}86, a version of GDB targeting 80@var{x}86 should be available as @samp{i386-elf-gdb}. + +@item +@strong{Recommended:} @uref{http://www.x.org/, X}. +Being able to use an X server makes the virtual machine feel more like a physical machine, but it is not strictly necessary. + +@item +@strong{Optional:} @uref{http://www.gnu.org/software/texinfo/, Texinfo}. +Version 4.5 or later. +Texinfo is required to build the PDF version of the main PintOS documentation. + +@item +@strong{Optional:} @uref{http://www.tug.org/, @TeX{}}. +@TeX{} is required to build the PDF versions of the support documentation. + +@item +@strong{Optional:} @uref{http://www.vmware.com/, VMware Player}. +This is another emulation platform that can be used to run PintOS instead of QEMU. +You will need to search online for an up-to-date installation guide. +@end itemize + +@node Installation +@section Installation + +Once you have checked that the prerequisites are available, +follow these instructions to install a PintOS development environment: + +@enumerate 1 + +@item +Compile the PintOS utilities in @file{src/utils}. + +To do this, open a terminal in the @file{src/utils} directory of your PintOS project and run @command{make}. + +@item +Install scripts from @file{src/utils}. + +This easiest way to do this is to reconfigure your system's @env{PATH} to include the @file{src/utils} directory of your PintOS project. +You can instead copy the files +@file{backtrace}, +@file{pintos}, +@file{pintos-gdb}, +@file{pintos-mkdisk}, +@file{pintos-set-cmdline}, +@file{Pintos.pm} +and +@file{squish-pty} +into your system's default @env{PATH}. + +If your Perl is older than version 5.8.0, then you will also need to install @file{setitimer-helper}; otherwise, it is unneeded. + +@item +Install the GDB macros from @file{src/misc/gdb-macros}. + +The easiest way to do this is to use a text editor to update your previously installed copy of @file{pintos-gdb} +so that the definition of @env{GDBMACROS} points to your local @file{gdb-macros} file. +You can instead copy the @file{pintos-gdb} file into a system directory of your choice, +but you will still need to update the definition of @env{GDBMACROS} in your installed copy of @file{pintos-gdb}. + +Test the GDB macro installation by running @command{pintos-gdb} without any arguments. +If it does not complain about missing @file{gdb-macros}, it is installed correctly. + +@item +PintOS should now be ready for use. + +To test your installation, open a terminal in the @file{src/devices} directory of your PintOS project and run @command{make check}. +This will run the tests for Task 0 and should take no more than a few minutes. + +@item +@strong{Optional:} Install alternative emulation software. + +To support VMware Player, install @file{squish-unix} (from the @file{src/utils} directory); otherwise it is unneeded. + +@item +@strong{Optional:} Build the PintOS documentation. + +Open a terminal in the @file{doc} directory of your PintOS project and run @command{make dist}. +This will create a @file{WWW} subdirectory within @file{doc} that contains both HTML and PDF versions of the documentation, +plus the design document templates and various hardware specifications referenced by the documentation. + +@end enumerate diff --git a/doc/intro.texi b/doc/intro.texi new file mode 100644 index 0000000..41e112f --- /dev/null +++ b/doc/intro.texi @@ -0,0 +1,564 @@ +@node Introduction +@chapter Introduction + +Welcome to PintOS. PintOS is a simple operating system framework for +the 80@var{x}86 architecture. It supports kernel threads, loading and +running user programs, and a file system, but it implements all of +these in a very simple way. During the PintOS tasks, you and your +group will strengthen its support in two of these areas. +You will also add a virtual memory implementation. + +PintOS could, theoretically, run on a regular IBM-compatible PC. +Unfortunately, it is impractical to supply every student +with a dedicated PC for use with PintOS. Therefore, we will be running PintOS +in a system simulator, that is, a program that simulates an 80@var{x}86 +CPU and its peripheral devices accurately enough that unmodified operating +systems and software can run under it. In particular, we will be using the +@uref{http://fabrice.bellard.free.fr/qemu/, , +QEMU} simulator. PintOS has also been tested with the +@uref{http://www.vmware.com/, , VMware Player}. + +These tasks are hard. The PintOS exercise have a reputation of taking a lot of +time, and deservedly so. We will do what we can to reduce the workload, such +as providing a lot of support material, but there is plenty of +hard work that needs to be done. We welcome your +feedback. If you have suggestions on how we can reduce the unnecessary +overhead of assignments, cutting them down to the important underlying +issues, please let us know. + +This version of the exercise has been adapted for use at Imperial College +London, and is significantly different to the original exercise designed at +Stanford University. It's recommended that you only use the Imperial version +of the documentation to avoid unnecessary confusion. + +This chapter explains how to get started working with PintOS. You +should read the entire chapter before you start work on any of the +tasks. + +@menu +* Getting Started:: +* Testing:: +* Submission:: +* Grading:: +* Legal and Ethical Issues:: +* Acknowledgements:: +* Trivia:: +@end menu + +@comment ---------------------------------------------------------------------- + +@node Getting Started +@section Getting Started + +To get started, you'll have to log into a machine that PintOS can be +built on. +@localmachines{} +We will test your code on these machines, and the instructions given +here assume this environment. We do not have the manpower to provide support for installing +and working on PintOS on your own machine, but we provide instructions +for doing so nonetheless (@pxref{Installing PintOS}). + +If you are using bash (the default shell for CSG-run machines), several PintOS +utilities will already be in your PATH. If you are not using bash on a CSG-run machine, +you will need to add these utilities manually. + +@localpathsetup{} + +@menu +* Source Tree Overview:: +* Building PintOS:: +* Running PintOS:: +@end menu + +@comment ---------------------------------------------------------------------- + +@node Source Tree Overview +@subsection Source Tree Overview + +For Task 0 each student has been provided with a Git repository on the department's @code{GitLab} +server that contains the files needed for this exercise. +To obtain this initial skeleton repository you will need to clone it into your local workspace. +You can do this with the following command: + +@example +git clone @value{localindivgitpath} +@end example +@noindent replacing @code{} with your normal college login. + +For the remaining tasks, each group will be provided with a Git repository on the department's @code{GitLab} +server that contains the files needed for the entire PintOS project. +To obtain this skeleton repository you will need to clone it into your local workspace. +You can do this with the following command: + +@example +git clone @value{localgitpath} +@end example +@noindent replacing @code{} with your group number, which can be found on the @code{GitLab} website. + +You should work on the files in your local workspace, making regular commits back to the corresponding Git repository. +Your final submissions will be taken from these @code{GitLab} repositories, so make sure that you push your work to them correctly. + +Let's take a look at what's inside the full PintOS repository. +Here's the directory structure that you should see in @file{pintos/src}: + +@table @file +@item devices/ + +Source code for I/O device interfacing: keyboard, timer, disk, etc. +You will modify the timer implementation in task 0. Otherwise +you should have no need to change this code. + +@item threads/ + +Source code for the base kernel, which you will modify in +task 1. + +@item userprog/ + +Source code for the user program loader, which you will modify +in task 2. + +@item vm/ + +An almost empty directory. You will implement virtual memory here in +task 3. + +@item filesys/ + +Source code for a basic file system. You will use this file system +in tasks 2 and 3. + +@item lib/ + +An implementation of a subset of the standard C library. The code in +this directory is compiled into both the PintOS kernel and, starting +from task 2, user programs that run under it. In both kernel code +and user programs, headers in this directory can be included using the +@code{#include <@dots{}>} notation. You should have little need to +modify this code. + +@item lib/kernel/ + +Parts of the C library that are included only in the PintOS kernel. +This also includes implementations of some data types that you are +free to use in your kernel code: bitmaps, doubly linked lists, and +hash tables. In the kernel, headers in this +directory can be included using the @code{#include <@dots{}>} +notation. + +@item lib/user/ + +Parts of the C library that are included only in PintOS user programs. +In user programs, headers in this directory can be included using the +@code{#include <@dots{}>} notation. + +@item tests/ + +Tests for each task. You can modify this code if it helps you test +your submission, but we will replace it with the originals before we run +the tests. + +@item examples/ + +Example user programs for use in tasks 2 and 3. + +@item misc/ +@itemx utils/ + +These files may come in handy if you decide to try working with PintOS +on your own machine. Otherwise, you can ignore them. +@end table + +@comment ---------------------------------------------------------------------- + +@node Building PintOS +@subsection Building PintOS + +As the next step, build the source code supplied for +the first task. First, @command{cd} into the @file{devices} +directory. Then, issue the @samp{make} command. This will create a +@file{build} directory under @file{devices}, populate it with a +@file{Makefile} and a few subdirectories, and then build the kernel +inside. The entire build should take less than 30 seconds. + +@localcrossbuild{} + +After the build has completed, you will find the following interesting files in the +@file{build} directory: + +@table @file +@item Makefile +A copy of @file{pintos/src/Makefile.build}. It describes how to build +the kernel. @xref{Adding Source Files}, for more information. + +@item kernel.o +Object file for the entire kernel. This is the result of linking +object files compiled from each individual kernel source file into a +single object file. It contains debug information, so you can run +GDB (@pxref{GDB}) or @command{backtrace} (@pxref{Backtraces}) on it. + +@item kernel.bin +Memory image of the kernel, that is, the exact bytes loaded into +memory to run the PintOS kernel. This is just @file{kernel.o} with +debug information stripped out, which saves a lot of space, which in +turn keeps the kernel from bumping up against a @w{512 kB} size limit +imposed by the kernel loader's design. + +@item loader.bin +Memory image for the kernel loader, a small chunk of code written in +assembly language that reads the kernel from disk into memory and +starts it up. It is exactly 512 bytes long, a size fixed by the +PC BIOS. +@end table + +Subdirectories of @file{build} contain object files (@file{.o}) and +dependency files (@file{.d}), both produced by the compiler. The +dependency files tell @command{make} which source files need to be +recompiled when other source or header files are changed. + +@comment ---------------------------------------------------------------------- + +@node Running PintOS +@subsection Running PintOS + +We've supplied a program for conveniently running PintOS in a simulator, +called @command{pintos}. In the simplest case, you can invoke +@command{pintos} as @code{pintos @var{argument}@dots{}}. Each +@var{argument} is passed to the PintOS kernel for it to act on. + +Try it out. First @command{cd} into the newly created @file{build} +directory. Then issue the command @code{pintos run alarm-multiple}, +which passes the arguments @code{run alarm-multiple} to the PintOS +kernel. In these arguments, @command{run} instructs the kernel to run a +test and @code{alarm-multiple} is the test to run. + +PintOS boots and runs the @code{alarm-multiple} test +program, which outputs a few screenfulls of text. +You can log serial output to a file by redirecting at the +command line, e.g.@: @code{pintos run alarm-multiple > logfile}. + +The @command{pintos} program offers several options for configuring the +simulator or the virtual hardware. If you specify any options, they +must precede the commands passed to the PintOS kernel and be separated +from them by @option{--}, so that the whole command looks like +@code{pintos @var{option}@dots{} -- @var{argument}@dots{}}. Invoke +@code{pintos} without any arguments to see a list of available options. +You can run the simulator with a debugger (@pxref{GDB}). You can also set the +amount of memory to give the VM. + +The PintOS kernel has commands and options other than @command{run}. +These are not very interesting for now, but you can see a list of them +using @option{-h}, e.g.@: @code{pintos -h}. + +@comment ---------------------------------------------------------------------- + +@page +@node Testing +@section Testing + +To help you ensure that your code will compile and run as expected in our testing environment we have provided you with a Lab Testing Service: LabTS. LabTS will clone your git repository and run several automated test process over your work. This will happen automatically when you submit your work, but can also be requested during the course of each task. + +You can access the LabTS webspages at @file{https://teaching.doc.ic.ac.uk/labts}. +Note that you will be required to log-in with your normal college username and password. + +If you click through to the @code{pintos} exercise you will see a list of the different versions of your work that you have pushed. +Next to each commit you will see a button that will allow you to request that this version of your work is run through the automated test process for the currently viewed milestone. If you click on this button your work will be tested (this may take a few minutes) and the results will appear om the relevant column. + +@cartouche +@noindent@strong{Important:} submitted code that fails to compile and run on LabTS will be awarded @strong{0 marks} for the automated tests grade! +You should be periodically (but not continuously) testing your code on LabTS. +If you are experiencing problems with the compilation or execution of your code then please seek help/advice as soon as possible. +@end cartouche + +Your automated test result grade will be based on our test suite. +Each task has several tests, each of which has a name beginning with @file{tests}. +To completely test your submission, invoke @code{make check} from the task @file{build} directory. +This will build and run each test and print a ``pass'' or ``fail'' message for each one. When a test fails, +@command{make check} also prints some details of the reason for failure. +After running all the tests, @command{make check} also prints a summary of the test results. +You can run @command{make grade} to see the automated test results output in the same format as will be presented to the markers. + +You can also run individual tests one at a time. +A given test @file{@var{t}} writes its output to @file{@var{t}.output}, +then a script scores the output as ``pass'' or ``fail'' and writes the verdict to @file{@var{t}.result}. +To run and grade a single test, +@command{make} the @file{.result} file explicitly from the @file{build} directory, e.g.@: @code{make tests/devices/alarm-multiple.result}. +If @command{make} says that the test result is up-to-date, but you want to re-run it anyway, +either run @code{make clean} or delete the @file{.output} file by hand. + +By default, each test provides feedback only at completion, not during its run. +If you prefer, you can observe the progress of each test by specifying @option{VERBOSE=1} on the @command{make} command line, +as in @code{make check VERBOSE=1}. +You can also provide arbitrary options to the @command{pintos} run by the tests with @option{PINTOSOPTS='@dots{}'}. + +All of the tests and related files can be found in @file{pintos/src/tests}. +Before we test your submission, we will replace the contents of this directory by a pristine, unmodified copy, to ensure that the correct tests are used. +Thus, you can freely modify any of the tests if that helps in your debugging, but we will run our automated tests on the originals. + +All software has bugs, so it is possible that some of our tests may be flawed. +If you think a test failure is a bug in the test, not a bug in your code, please point it out. +We will look at it and fix it if necessary. + +Please don't try to take advantage of our generosity in giving out the full test suite. +Your code has to work properly in the general case and not just for the test cases we supply. +We will be asking questions about the general case during the code review sessions, so you won't be able to get away with it. +For example, it would be unacceptable to explicitly base the kernel's behaviour on the name of the running test case. +Such attempts to side-step the test cases will be spotted during the code review process and will receive no credit. +If you think your solution may be in a gray area here, please ask us about it. + +@menu +* Debugging versus Testing:: +@end menu + +@comment ---------------------------------------------------------------------- + +@node Debugging versus Testing +@subsection Debugging versus Testing + +The QEMU simulator you will be using to run PintOS only supports real-time +simulations. This has ramifications with regards to both testing and debugging. + +Whilst reproducibility is in general extremely useful for debugging, running PintOS in QEMU is not necessarily deterministic. +You should keep this in mind when testing for bugs in your code. +In each run, timer interrupts will come at irregularly spaced intervals, meaning that bugs may appear and disappear with repeated tests. +Therefore, it's very important that you run your tests at a least few times. +No number of runs can guarantee that your synchronisation is perfect, +but the more you do, the more confident you can be that your code doesn't have major flaws. + +@cartouche +@noindent@strong{Important:} the PintOS kernel is written for a single-cored CPU, +which helps to limit the possible interleavings of concurrently executing threads. +However, as you have no control over the occurence of timer interrupts, +you will still need to consider the implications of your code being interrupted at almost any arbitrary point. +Much of our assessment will be conducted as a ``demonic'' scheduler that chooses the ``worst-case'' possibilities. +@end cartouche + +@comment ---------------------------------------------------------------------- + +@node Submission +@section Submission +As you work, you should @code{add}, @code{commit} and @code{push} your changes to your git repository. +Your @code{GitLab} repository should contain the source code, header files and make files for your OS. + +Prior to submission, you should check the state of your @code{GitLab} repository using the @code{LabTS} webpages at +@file{https://teaching.doc.ic.ac.uk/labts}. +If you click through to the @code{pintos} exercise you will see a list of the different versions of your work that you have pushed to the master branch of your repository. +Next to each commit you will see a link to that commit on @code{GitLab} as well as a button to submit that version of your code for assessment. + +You should submit the version of your code that you consider to be "final" for each task. +You can change this later, as usual, by submitting a different version of your code. +The submission button on LabTS will be replaced with a green confirmation message if the submission has been sucessful. + +For each @code{pintos} task you will also need to submit a design document (@code{designT#.pdf}) directly to Scientia. +Your submission must be signed off as a group on Scientia in the usual way. + +@comment ---------------------------------------------------------------------- + +@node Grading +@section Grading + +We will grade each @code{pintos} task over 3 catagories: +@itemize +@item @strong{automated tests}: your score from the automated test results. +@item @strong{code review}: an assessment of your design quality and efficiency. +@item @strong{design document}: your answers to the task's design document questions. +@end itemize + +The marks for each @code{pintos} task will contribute to both your @value{coursenumber} Operating Systems coursework mark and your @value{labnumber} Computing Practical 2 exercises mark. + +For @code{pintos} task 0, part A will make up all of the task's Operating Systems coursework grade, while part B will make up all of the task's Computing Practical 2 grade. + +For all other @code{pintos} tasks, the automated tests will count for 40% of each task's Computing Practical 2 grade with the code review making up the other 60%. +The design document will count for 100% of the Operating Systems coursework grade for each of these tasks. + +Note that some of the automated tests may be zero-weighted. These tests help us to identify likely design issues in your code and will probably affect your code review mark. + + +The weighting of the @code{pintos} tasks is 10%, 20%, 30% and 40% for each of task 0, task 1, task 2 and task 3 respectively. +JMC students are not assessed on task 3, but have the same relative weighting for task 0, task 1 and task 2. + +@menu +* Design:: +@end menu + +@comment ---------------------------------------------------------------------- + +@node Design +@subsection Design + +We will judge your design based on the design document and the source code that you submit. +We will read your entire design document and much of your source code. + +@cartouche +@noindent@strong{Important:} Don't forget that design quality and efficiency will account for 60% of each task's @value{labnumber} Computing Practical 2 grade +and that the design documents will make up your entire @value{coursenumber} Operating Systems coursework mark. +It is, therefore, better to spend a day or two writing a good design document and thinking about the efficiency and edge-cases of your code, +than it is to spend that time trying to get the last 5% of the points for the automated tests +and then having to rush through writing the design document in the last 15 minutes. +@end cartouche + +@menu +* Design Document:: +* Source Code:: +@end menu + +@comment ---------------------------------------------------------------------- + +@node Design Document +@subsubsection Design Document + +We will provide you with a design document template for each task. +For each significant part of a task, the template asks questions in four areas: + +@table @strong +@item Data Structures + +The instructions for this section are always the same: + +@quotation +Copy here the declaration of each new or changed @code{struct} or @code{struct} member, global or static variable, @code{typedef}, or enumeration. +Identify the purpose of each in roughly 25 words. +@end quotation + +The first part is mechanical. +Just copy new or modified declarations into the design document to highlight for us the actual changes to data structures. +Each declaration should include the comment that should accompany it in the source code (see below). + +We also ask for a very brief description of the purpose of each new or changed data structure. +The suggestion of 25 words is a guideline intended to save your time and avoid duplication with later areas of the design document. + +@item Algorithms + +This is where you tell us how your code works, through questions that probe your understanding of your code. +We might not be able to easily figure it out from the code alone, because many creative solutions exist for most OS problems. +Help us out a little. + +Your answers should be at a level below the high level description of requirements given in the assignment. +We have read the assignment too, so it is unnecessary to repeat or rephrase what is stated there. +On the other hand, your answers should be at a level above the low level of the code itself. +Don't give a line-by-line run-down of what your code does. +Instead, use your answers to explain how your code works to implement the requirements. + +@item Synchronization + +An operating system kernel is a complex, multithreaded program, in which synchronizing multiple threads can be difficult. +This section asks about how you chose to synchronize this particular type of activity. + +@item Rationale + +Whereas the other sections primarily ask ``what'' and ``how,'' the rationale section concentrates on ``why''. +This is where we ask you to justify some of your design decisions, by explaining why the choices you made are better than alternatives you considered. +You may be able to state these justifications in terms of time and space complexity, which can be made as rough or informal arguments (formal language or proofs are unnecessary). +@end table + +Any incomplete, evasive, or non-responsive answers to design document questions or those that stray from the provided template without good reason may be penalised. +Additionally, any design docuement that does not match the reality of your implementation may be penalised unless any descrepencies are clearly stated and explained. +Incorrect capitalization, punctuation, spelling, or grammar may also cost points if this impedes our reading of your design document. +@xref{Task Documentation}, for an example design document for a fictitious task. + +@cartouche +@noindent@strong{Important:} You should carefully read the design document for a task before you begin writing any code. +The questions we ask should help you identify some of the tricky corner cases that your implementation will be expected to handle. +@end cartouche + +@comment ---------------------------------------------------------------------- + +@node Source Code +@subsubsection Source Code + +Your design will also be judged by reviewing your source code with you during interactive code review sessions. +We will typically look at the differences between the original PintOS source tree and your submission, +based on the output of a command like @code{diff -urpb pintos.orig pintos.submitted} or reviewing the Git commits directly on @code{GitLab}. +We will try to match up your description of the design with the code submitted. +Important discrepancies between the description and the actual code will be penalised, as will be any bugs we find by spot checks during the code review sessions. + +The most important aspects of source code design are those that specifically relate to the operating system issues at stake in the task. +It is important that you consider the efficiency of your operating system design choices, but other issues are much more important. +For example, multiple PintOS design problems call for a ``priority queue'', that is, + a dynamic collection from which the minimum (or maximum) item can quickly be extracted. +Fast priority queues can be implemented many ways, but we do not expect you to build a fancy data structure even if it might improve performance. +Instead, you are welcome to use a linked list (and PintOS even provides one with convenient functions for sorting and finding minimums and maximums). + +PintOS is written in a consistent style. +Your additions and modifications do not have to be in the same style as the existing PintOS source files, +but you should ensure that your code style is self-consistent. +There should not be a patchwork of different styles that makes it obvious that three or four different people wrote the code. +Use horizontal and vertical white space to make code readable. +Add a brief comment on every structure, structure member, global or static variable, typedef, enumeration, and function definition. +Use phase-level comments within fuctions to help explain longer, or more complicated, behaviour. +Update existing comments as you modify code. +Don't comment out or use the preprocessor to ignore blocks of code (instead, remove it entirely - remember you have Git if you need to get it back). +Use assertions to document key invariants. +Decompose code into functions for clarity. +Code that is difficult to understand because it violates these or other ``common sense'' software engineering practices will be penalised during the code review sessions. + +In the end, remember your audience. +Code is written primarily to be read by humans. +It has to be acceptable to the compiler too, but the compiler doesn't care about how it looks or how well it is written. +@xref{Coding Standards} for additional guidance. + +@comment ---------------------------------------------------------------------- + +@page +@node Legal and Ethical Issues +@section Legal and Ethical Issues + +PintOS is distributed under a liberal license that allows free use, modification, and distribution of this material. +Students and others who work on PintOS own the code that they write and may use it for any purpose. +PintOS comes with NO WARRANTY, not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +@xref{License}, for details of the license and lack of warranty. + +@localhonorcodepolicy{} + +@comment ---------------------------------------------------------------------- + +@node Acknowledgements +@section Acknowledgements + +The PintOS core kernel and this documentation were originally written by Ben +Pfaff @email{blp@@cs.stanford.edu}. + +Additional features were contributed by Anthony Romano +@email{chz@@vt.edu}. + +The GDB macros supplied with PintOS were written by Godmar Back +@email{gback@@cs.vt.edu}, and their documentation is adapted from his +work. + +The original structure and form of PintOS was inspired by the Nachos +instructional operating system from the University of California, +Berkeley (@bibref{Christopher}). + +The PintOS tasks and documentation originated with those designed for +Nachos by current and former CS 140 teaching assistants at Stanford +University, including at least Yu Ping, Greg Hutchins, Kelly Shaw, Paul +Twohey, Sameer Qureshi, and John Rector. + +Example code for monitors (@pxref{Monitors}) is +from classroom slides originally by Dawson Engler and updated by Mendel +Rosenblum. + +@localcredits{} + +@comment ---------------------------------------------------------------------- + +@node Trivia +@section Trivia + +PintOS originated as a replacement for Nachos with a similar design. +Since then PintOS has greatly diverged from the Nachos design. +PintOS differs from Nachos in two important ways: + +@itemize +@item First, PintOS runs on real or simulated 80@var{x}86 hardware, but Nachos runs as a process on a host operating system. +@item Second, PintOS is written in C like most real-world operating systems, but Nachos is written in C++. +@end itemize + +@noindent@strong{So, why the name ``PintOS''?} + +@itemize +@item First, like nachos, pinto beans are a common Mexican food. +@item Second, PintOS is small and a ``pint'' is a small amount. +@item Third, like drivers of the eponymous car, students are likely to have trouble with blow-ups. +@end itemize + diff --git a/doc/license.texi b/doc/license.texi new file mode 100644 index 0000000..819df7b --- /dev/null +++ b/doc/license.texi @@ -0,0 +1,62 @@ +@node License +@appendix License + +PintOS, including its documentation, is subject to the following +license: + +@quotation +Copyright @copyright{} 2004, 2005, 2006 Board of Trustees, Leland +Stanford Jr.@: University. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +``Software''), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +@end quotation + +A few individual files in PintOS were originally derived from other +projects, but they have been extensively modified for use in PintOS. +The original code falls under the original license, and modifications +for PintOS are additionally covered by the PintOS license above. + +In particular, code derived from Nachos is subject to the following +license: + +@quotation +Copyright @copyright{} 1992-1996 The Regents of the University of California. +All rights reserved. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose, without fee, and +without written agreement is hereby granted, provided that the +above copyright notice and the following two paragraphs appear +in all copies of this software. + +IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO +ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE +AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA +HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN ``AS IS'' +BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +MODIFICATIONS. +@end quotation diff --git a/doc/localgitinstructions.texi b/doc/localgitinstructions.texi new file mode 100644 index 0000000..82cae51 --- /dev/null +++ b/doc/localgitinstructions.texi @@ -0,0 +1,96 @@ +@c +@c Instructions on how to set up a group environment, permissions, +@c Git repository, dealing with issues etc. +@c +@c While some of the discussion may apply to more than one environment, +@c no attempt was made to untangle and split the discussion. +@c + +@menu +* Setting Up Git:: +* Using Git:: +@end menu + +@node Setting Up Git +@subsection Setting Up Git + +To make your Git logs easier to read, you should set the user.name and +user.email variables in your .gitconfig file: +@verbatim +[user] + name = Firstname Surname + email = example@doc.ic.ac.uk +@end verbatim + +Note that we will be checking your Git logs as part of your submission. +You should ensure that you use meaningful commit messages and make it clear +who was responsible for each commit (especially if you are using pair-programming). + +To work on the source code, you must create a clone of your group's provided @file{GitLab} repository. +This can be done by running the following command: + +@example +git clone @value{localgitpath} +@end example +replacing @code{} with your group number, which can be found on the @code{Gitlab} website. + +@node Using Git +@subsection Using Git + +Once you've cloned the repository, you can start working in your clone +straight away. At any point you can see what files you've modified with +@samp{git status}, and check a file in greater detail with +@samp{git diff @var{filename}}. You view more detailed information using +tools such as @samp{tig} + +Git uses an intermediary area between the working filesystem and the actual +repository, known as the staging area (or index). This allows you to perform +tasks such as committing only a subset of your changes, without modifying your +copy of the filesystem. Whilst the uses of the staging area are outside the +scope of this guide, it is important that you are aware of its existence. + +When you want to place your modifications into the repository, you must +first update the staging area with your changes (@samp{git add @var{filename}}, +and then use this to update the repository, using @samp{git commit}. Git +will open a text editor when committing, allowing you to provide a description +of your changes. This can be useful later for reviewing the repository, +so be sensible with your commit messages. + +When you want to share your changes with the rest of your group you will need to +run @samp{git push} to send your commits back to the shared @file{labranch} repository. +Note that the very first time you push you will need to run the command: + +@example +git push origin master +@end example +to tell Git which branch of your local repository to push to which remote repository +(in this case from branch @code{master} to the @code{origin} repository). + +Sometimes your group members may make confliting changes to your repository, +which Git is unable to solve. +These problems can be solved using @samp{git mergetool}, +but its use is outside the scope of this dicussion. + +You can view the history of a file @var{foo} in your working directory, +including the log messages, with @samp{git log @var{foo}}. + +You can give a particular set of file versions a name called a +@dfn{tag}. Simply execute @samp{git tag @var{name}}. It's best +to have no local changes in the working copy when you do this, because +the tag will not include uncommitted changes. To recover the tagged +commit later, simply execute @samp{git checkout @var{tag}}. + +If you add a new file to the source tree, you'll need to add it to the +repository with @samp{git add @var{file}}. This command does not have +lasting effect until the file is committed later with @samp{git +commit}. + +To remove a file from the source tree, first remove it from the file +system with @samp{git rm @var{file}}. Again, only @samp{git commit} +will make the change permanent. + +To discard your local changes for a given file, without committing +them, use @samp{git checkout @var{file} -f}. + +For more information, visit the @uref{https://www.git-scm.com/, , Git +home page}. diff --git a/doc/localsettings.texi b/doc/localsettings.texi new file mode 100644 index 0000000..0399ef3 --- /dev/null +++ b/doc/localsettings.texi @@ -0,0 +1,73 @@ +@c Local settings + +@set coursenumber COMP50004 +@set labnumber COMP50007/500012 +@set localpintosgitpath /vol/lab/secondyear/osexercise/pintos.git +@set localpintosbindir /vol/lab/secondyear/bin/ +@set localgitpath https://gitlab.doc.ic.ac.uk/lab2425_autumn/pintos_.git +@set localindivgitpath https://gitlab.doc.ic.ac.uk/lab2425_autumn/pintos_task0_.git + +@set recommendvnc +@clear recommendcygwin + +@macro localmachines{} +The machines officially supported for PintOS development are +the Linux machines in the labs managed by CSG, as described on +the @uref{http://www.doc.ic.ac.uk/csg/facilities/lab/workstations, , +CSG webpage}. +@end macro + +@macro localpathsetup{} +The PintOS utilities can be located at @value{localpintosbindir} on CSG-run +lab machines. +@end macro + +@macro localcrossbuild{} +Watch the commands executed during the build. +On the Linux machines, the ordinary system tools are used. +@end macro + +@macro localhonorcodepolicy{} +Please respect the college's plagiarism policy by refraining from reading any coursework solutions available online or elsewhere. +You must also refrain from posting any of your code or solutions publically online (such as on GitHub) or sharing them with your classmates. + +Reading the source code for other operating system kernels, such as Linux or FreeBSD, is allowed, +but do not copy code from them literally. +You must cite any code that inspired your own in your design documentation. +@end macro + +@macro localcredits{} +Additional modifications have been made to the documentation, code and task structure when adapting and developing the material +for use at Imperial College London by Mark Rutland, Feroz Abdul Salam, Mark Wheelhouse, Fabio Luporini and Fidelis Perkonigg. + +A number of DoC students have also made valuable contributions to the ongoing development of the @code{pintos} +project@footnote{If you have suggestions for improving the @code{pintos} tasks, spot and fix a bug or contribute new material to the project, then you too could be added to the above list. If interested, please discuss with Dr Mark Wheelhouse.}, +and we thank them here: +@itemize +@item Dragos Dumitrache (2015) - created the first version of the ``pintos for Mac'' guide. +@item Nandor Licker (2015) - spotted an upcoming change to QEMU in 2015 that would have interfered with the @code{pintos} shutdown code. +@item Levente Kurusa (2017) - updated the ``pintos for Mac'' guide for more recent versions of MacOS and created the original Mac installation patch files (now merged into the main repo). +@item Emma Gospodinova (2019) - spotted the need to add the @code{-fno-ptr} and @code{-fno-pie} flags to @code{gcc} calls in the @code{pintos} makefiles, which would otherwise lead to key parts of the user-programs code being optimised out. +@item Moritz Langenstein (2019) - identified the need for additional explicit type conversions in numerous test cases to support stronger @code{gcc} warning flags. +@item Alex Tasos (2021) - provided a linker script @code{loaderfix.ld} to fix a bug in linking the @code{pintos} loader (@code{loader.bin}) on Arch Linux systems. +@item Bartlomiej Cieslar (2021) - spotted a potential double-free in the @code{load_segment} function in @code{src/userprog/process.c}. +@item Charlie Lidbury (2021) - spotted a potential issue with setting the writable flag for overlapping pages in the @code{load_segment} function in @code{src/userprog/process.c}. +@item Chun Wong (2023) - spotted a potential race-condition on @code{ready_list} in the @code{threads_ready} function in @code{src/threads/thread.c}. +@item Luke Moran (2023) - suggested adding div-by-zero checks to Task 2 (including @code{multi-oom}). +@item Reuben Cartwright (2023) - spotted a counter increment bug in the @code{pt-overflowstk} test. +@end itemize + + +@end macro + +@macro localgitpolicy{} +Instead, we recommend integrating your team's changes early and often +using Git (@pxref{Git}). + +This is less likely to produce surprises, because everyone can see everyone else's code as it is written, instead of just when it is finished. +Version control also makes it possible to review changes and, when a change introduces a bug, drop back to working versions of code. +@end macro + +@macro localdevelopmenttools{} +@c Descriptions of additional, local development tools can be inserted here +@end macro diff --git a/doc/pintos-ic.texi b/doc/pintos-ic.texi new file mode 100644 index 0000000..4f45572 --- /dev/null +++ b/doc/pintos-ic.texi @@ -0,0 +1,92 @@ +\input texinfo @c -*- texinfo -*- + +@c %**start of header +@setfilename pintos-ic.info +@settitle PintOS Tasks +@c %**end of header + +@c @bibref{} macro +@iftex +@macro bibref{cite} +[\cite\] +@end macro +@afourpaper +@end iftex +@ifinfo +@ifnotplaintext +@macro bibref{cite} +@ref{\cite\} +@end macro +@end ifnotplaintext +@ifplaintext +@macro bibref{cite} +[\cite\] +@end macro +@end ifplaintext +@end ifinfo +@ifhtml +@macro bibref{cite} +[@ref{\cite\}] +@end macro +@end ifhtml + +@macro func{name} +@code{\name\()} +@end macro + +@macro struct{name} +@code{struct \name\} +@end macro + +@finalout + +@titlepage +@title PintOS (Imperial College Edition) +Version 2.5.1 +@author Originally by Ben Pfaff +@end titlepage + +@shortcontents +@contents + +@ifnottex +@node Top, Introduction, (dir), (dir) +@top PintOS Tasks +@end ifnottex + +@menu +* Introduction:: +* Task 0--Codebase:: +* Task 1--Threads:: +* Task 2--User Programs:: +* Task 3--Virtual Memory:: +* Reference Guide:: +* 4.4BSD Scheduler:: +* Coding Standards:: +* Task Documentation:: +* Debugging Tools:: +* Development Tools:: +* Installing PintOS:: +* Bibliography:: +* License:: +@end menu + +@c institution-local settings +@include localsettings.texi + +@include intro.texi +@include codebase.texi +@include threads.texi +@include userprog.texi +@include vm.texi +@include reference.texi +@include 44bsd.texi +@include standards.texi +@include doc.texi +@include debug.texi +@include devel.texi +@include installation.texi +@include bibliography.texi +@include license.texi + +@bye diff --git a/doc/pintos-t2h.init b/doc/pintos-t2h.init new file mode 100644 index 0000000..064e25a --- /dev/null +++ b/doc/pintos-t2h.init @@ -0,0 +1,16 @@ +sub T2H_InitGlobals +{ + # Set the default body text, inserted between + $T2H_BODYTEXT = ''; + # text inserted after + $T2H_AFTER_BODY_OPEN = ''; + #text inserted before + $T2H_PRE_BODY_CLOSE = ''; + # this is used in footer + $T2H_ADDRESS = "$T2H_USER " if $T2H_USER; + $T2H_ADDRESS .= "on $T2H_TODAY"; + # this is added inside after and some META NAME stuff + # can be used for <style> <script>, <meta> tags + $T2H_EXTRA_HEAD = "<LINK REL=\"stylesheet\" HREF=\"pintos.css\">"; +} +1; diff --git a/doc/pintos.css b/doc/pintos.css new file mode 100644 index 0000000..0af878f --- /dev/null +++ b/doc/pintos.css @@ -0,0 +1,76 @@ +body { + background: white; + color: black; + padding: 0em 1em 0em 3em; + margin: 0; + margin-left: auto; + margin-right: auto; + max-width: 8in; + text-align: justify +} +body>p { + margin: 0pt 0pt 0pt 0em; + text-align: justify +} +body>p + p { + margin: .75em 0pt 0pt 0pt +} +H1 { + font-size: 150%; + margin-left: -1.33em +} +H2 { + font-size: 125%; + font-weight: bold; + margin-left: -.8em +} +H3 { + font-size: 100%; + font-weight: bold; + margin-left: -.5em } +H4 { + font-size: 100%; + margin-left: 0em +} +H1, H2, H3, H4, H5, H6 { + font-family: sans-serif; + color: blue +} +H1, H2 { + text-decoration: underline +} +html { + margin: 0; + font-weight: lighter +} +tt, code { + font-family: sans-serif +} +b, strong { + font-weight: bold +} + +a:link { + color: blue; + text-decoration: none; +} +a:visited { + color: gray; + text-decoration: none; +} +a:active { + color: black; + text-decoration: none; +} +a:hover { + text-decoration: underline +} + +address { + font-size: 90%; + font-style: normal +} + +HR { + display: none +} diff --git a/doc/reference.texi b/doc/reference.texi new file mode 100644 index 0000000..a2c012e --- /dev/null +++ b/doc/reference.texi @@ -0,0 +1,2616 @@ +@node Reference Guide +@appendix Reference Guide + +This chapter is a reference for the PintOS code. The reference guide +does not cover all of the code in PintOS, but it does cover those +pieces that students most often find troublesome. You may find that +you want to read each part of the reference guide as you work on the +task where it becomes important. + +We recommend using ``tags'' to follow along with references to function +and variable names (@pxref{Tags}). + +@menu +* PintOS Loading:: +* Threads:: +* Synchronization:: +* Interrupt Handling:: +* Memory Allocation:: +* Virtual Addresses:: +* Page Table:: +* Linked List:: +* Hash Table:: +@end menu + +@node PintOS Loading +@section Loading + +This section covers the PintOS loader and basic kernel +initialization. + +@menu +* PintOS Loader:: +* Low-Level Kernel Initialization:: +* High-Level Kernel Initialization:: +* Physical Memory Map:: +@end menu + +@node PintOS Loader +@subsection The Loader + +The first part of PintOS that runs is the loader, in +@file{threads/loader.S}. The PC BIOS loads the loader into memory. +The loader, in turn, is responsible for finding the kernel on disk, +loading it into memory, and then jumping to its start. It's +not important to understand exactly how the loader works, but if +you're interested, read on. You should probably read along with the +loader's source. You should also understand the basics of the +80@var{x}86 architecture as described by chapter 3, ``Basic Execution +Environment,'' of @bibref{IA32-v1}. + +The PC BIOS loads the loader from the first sector of the first hard +disk, called the @dfn{master boot record} (MBR). PC conventions +reserve 64 bytes of the MBR for the partition table, and PintOS uses +about 128 additional bytes for kernel command-line arguments. This +leaves a little over 300 bytes for the loader's own code. This is a +severe restriction that means, practically speaking, the loader must +be written in assembly language. + +The PintOS loader and kernel don't have to be on the same disk, nor +is the kernel required to be in any particular location on a +given disk. The loader's first job, then, is to find the kernel by +reading the partition table on each hard disk, looking for a bootable +partition of the type used for a PintOS kernel. + +When the loader finds a bootable kernel partition, it reads the +partition's contents into memory at physical address @w{128 kB}. The +kernel is at the beginning of the partition, which might be larger +than necessary due to partition boundary alignment conventions, so the +loader reads no more than @w{512 kB} (and the PintOS build process +will refuse to produce kernels larger than that). Reading more data +than this would cross into the region from @w{640 kB} to @w{1 MB} that +the PC architecture reserves for hardware and the BIOS, and a standard +PC BIOS does not provide any means to load the kernel above @w{1 MB}. + +The loader's final job is to extract the entry point from the loaded +kernel image and transfer control to it. The entry point is not at a +predictable location, but the kernel's ELF header contains a pointer +to it. The loader extracts the pointer and jumps to the location it +points to. + +The PintOS kernel command line +is stored in the boot loader. The @command{pintos} program actually +modifies a copy of the boot loader on disk each time it runs the kernel, +inserting whatever command-line arguments the user supplies to the kernel, +and then the kernel at boot time reads those arguments out of the boot +loader in memory. This is not an elegant solution, but it is simple +and effective. + +@node Low-Level Kernel Initialization +@subsection Low-Level Kernel Initialization + +The loader's last action is to transfer control to the kernel's entry +point, which is @func{start} in @file{threads/start.S}. The job of +this code is to switch the CPU from legacy 16-bit ``real mode'' into +the 32-bit ``protected mode'' used by all modern 80@var{x}86 operating +systems. + +The startup code's first task is actually to obtain the machine's +memory size, by asking the BIOS for the PC's memory size. The +simplest BIOS function to do this can only detect up to 64 MB of RAM, +so that's the practical limit that PintOS can support. The function +stores the memory size, in pages, in global variable +@code{init_ram_pages}. + +The first part of CPU initialization is to enable the A20 line, that +is, the CPU's address line numbered 20. For historical reasons, PCs +boot with this address line fixed at 0, which means that attempts to +access memory beyond the first 1 MB (2 raised to the 20th power) will +fail. PintOS wants to access more memory than this, so we have to +enable it. + +Next, the loader creates a basic page table. This page table maps +the 64 MB at the base of virtual memory (starting at virtual address +0) directly to the identical physical addresses. It also maps the +same physical memory starting at virtual address +@code{LOADER_PHYS_BASE}, which defaults to @t{0xc0000000} (3 GB). The +PintOS kernel only wants the latter mapping, but there's a +chicken-and-egg problem if we don't include the former: our current +virtual address is roughly @t{0x20000}, the location where the loader +put us, and we can't jump to @t{0xc0020000} until we turn on the +page table, but if we turn on the page table without jumping there, +then we've just pulled the rug out from under ourselves. + +After the page table is initialized, we load the CPU's control +registers to turn on protected mode and paging, and set up the segment +registers. We aren't yet equipped to handle interrupts in protected +mode, so we disable interrupts. The final step is to call @func{main}. + +@node High-Level Kernel Initialization +@subsection High-Level Kernel Initialization + +The kernel proper starts with the @func{main} function. The +@func{main} function is written in C, as will be most of the code we +encounter in PintOS from here on out. + +When @func{main} starts, the system is in a pretty raw state. We're +in 32-bit protected mode with paging enabled, but hardly anything else is +ready. Thus, the @func{main} function consists primarily of calls +into other PintOS modules' initialization functions. +These are usually named @func{@var{module}_init}, where +@var{module} is the module's name, @file{@var{module}.c} is the +module's source code, and @file{@var{module}.h} is the module's +header. + +The first step in @func{main} is to call @func{bss_init}, which clears +out the kernel's ``BSS'', which is the traditional name for a +segment that should be initialized to all zeros. In most C +implementations, whenever you +declare a variable outside a function without providing an +initializer, that variable goes into the BSS. Because it's all zeros, the +BSS isn't stored in the image that the loader brought into memory. We +just use @func{memset} to zero it out. + +Next, @func{main} calls @func{read_command_line} to break the kernel command +line into arguments, then @func{parse_options} to read any options at +the beginning of the command line. (Actions specified on the +command line execute later.) + +@func{thread_init} initializes the thread system. We will defer full +discussion to our discussion of PintOS threads below. It is called so +early in initialization because a valid thread structure is a +prerequisite for acquiring a lock, and lock acquisition in turn is +important to other PintOS subsystems. Then we initialize the console +and print a startup message to the console. + +The next block of functions we call initializes the kernel's memory +system. @func{palloc_init} sets up the kernel page allocator, which +doles out memory one or more pages at a time (@pxref{Page Allocator}). +@func{malloc_init} sets +up the allocator that handles allocations of arbitrary-size blocks of +memory (@pxref{Block Allocator}). +@func{paging_init} sets up a page table for the kernel (@pxref{Page +Table}). + +In tasks 2 and later, @func{main} also calls @func{tss_init} and +@func{gdt_init}. + +The next set of calls initializes the interrupt system. +@func{intr_init} sets up the CPU's @dfn{interrupt descriptor table} +(IDT) to ready it for interrupt handling (@pxref{Interrupt +Infrastructure}), then @func{timer_init} and @func{kbd_init} prepare for +handling timer interrupts and keyboard interrupts, respectively. +@func{input_init} sets up to merge serial and keyboard input into one +stream. In +tasks 2 and later, we also prepare to handle interrupts caused by +user programs using @func{exception_init} and @func{syscall_init}. + +Now that interrupts are set up, we can start the scheduler +with @func{thread_start}, which creates the idle thread and enables +interrupts. +With interrupts enabled, interrupt-driven serial port I/O becomes +possible, so we use +@func{serial_init_queue} to switch to that mode. Finally, +@func{timer_calibrate} calibrates the timer for accurate short delays. + +If the file system is compiled in, as it will starting in task 2, we +initialize the IDE disks with @func{ide_init}, then the +file system with @func{filesys_init}. + +The PintOS boot is then complete, so we print a message. + +Function @func{run_actions} now parses and executes actions specified on +the kernel command line, such as @command{run} to run a test (in task +1) or a user program (in later tasks). + +Finally, if @option{-q} was specified on the kernel command line, we +call @func{shutdown_power_off} to terminate the machine simulator. Otherwise, +@func{main} calls @func{thread_exit}, which allows any other running +threads to continue running. + +@node Physical Memory Map +@subsection Physical Memory Map + +@multitable {@t{00000000}--@t{00000000}} {Hardware} {Some much longer explanatory text} +@headitem Memory Range +@tab Owner +@tab Contents + +@item @t{00000000}--@t{000003ff} @tab CPU @tab Real mode interrupt table. +@item @t{00000400}--@t{000005ff} @tab BIOS @tab Miscellaneous data area. +@item @t{00000600}--@t{00007bff} @tab --- @tab --- +@item @t{00007c00}--@t{00007dff} @tab PintOS @tab Loader. +@item @t{0000e000}--@t{0000efff} @tab PintOS +@tab Stack for loader; kernel stack and @struct{thread} for initial +kernel thread. +@item @t{0000f000}--@t{0000ffff} @tab PintOS +@tab Page directory for startup code. +@item @t{00010000}--@t{00020000} @tab PintOS +@tab Page tables for startup code. +@item @t{00020000}--@t{0009ffff} @tab PintOS +@tab Kernel code, data, and uninitialized data segments. +@item @t{000a0000}--@t{000bffff} @tab Video @tab VGA display memory. +@item @t{000c0000}--@t{000effff} @tab Hardware +@tab Reserved for expansion card RAM and ROM. +@item @t{000f0000}--@t{000fffff} @tab BIOS @tab ROM BIOS. +@item @t{00100000}--@t{03ffffff} @tab PintOS @tab Dynamic memory allocation. +@end multitable + +@node Threads +@section Threads + +@menu +* struct thread:: +* Thread Functions:: +* Thread Switching:: +@end menu + +@node struct thread +@subsection @code{struct thread} + +The main PintOS data structure for threads is @struct{thread}, +declared in @file{threads/thread.h}. + +@deftp {Structure} {struct thread} +Represents a thread or a user process. In the tasks, you will have +to add your own members to @struct{thread}. You may also change or +delete the definitions of existing members. + +Every @struct{thread} occupies the beginning of its own page of +memory. The rest of the page is used for the thread's stack, which +grows downward from the end of the page. It looks like this: + +@example +@group + 4 kB +---------------------------------+ + | kernel stack | + | | | + | | | + | V | + | grows downward | + | | + | | + | | + | | + | | + | | + | | + | | +sizeof (struct thread) +---------------------------------+ + | magic | + | : | + | : | + | status | + | tid | + 0 kB +---------------------------------+ +@end group +@end example + +This has two consequences. First, @struct{thread} must not be allowed +to grow too big. If it does, then there will not be enough room for the +kernel stack. The base @struct{thread} is only a few bytes in size. It +probably should stay well under 1 kB. + +Second, kernel stacks must not be allowed to grow too large. If a stack +overflows, it will corrupt the thread state. Thus, kernel functions +should not allocate large structures or arrays as non-static local +variables. Use dynamic allocation with @func{malloc} or +@func{palloc_get_page} instead (@pxref{Memory Allocation}). +@end deftp + +@deftypecv {Member} {@struct{thread}} {tid_t} tid +The thread's thread identifier or @dfn{tid}. Every thread must have a +tid that is unique over the entire lifetime of the kernel. By +default, @code{tid_t} is a @code{typedef} for @code{int} and each new +thread receives the numerically next higher tid, starting from 1 for +the initial process. You can change the type and the numbering scheme +if you like. +@end deftypecv + +@deftypecv {Member} {@struct{thread}} {enum thread_status} status +@anchor{Thread States} +The thread's state, one of the following: + +@defvr {Thread State} @code{THREAD_RUNNING} +The thread is running. Exactly one thread is running at a given time. +@func{thread_current} returns the running thread. +@end defvr + +@defvr {Thread State} @code{THREAD_READY} +The thread is ready to run, but it's not running right now. The +thread could be selected to run the next time the scheduler is +invoked. Ready threads are kept in a doubly linked list called +@code{ready_list}. +@end defvr + +@defvr {Thread State} @code{THREAD_BLOCKED} +The thread is waiting for something, e.g.@: a lock to become +available, an interrupt to be invoked. The thread won't be scheduled +again until it transitions to the @code{THREAD_READY} state with a +call to @func{thread_unblock}. This is most conveniently done +indirectly, using one of the PintOS synchronization primitives that +block and unblock threads automatically (@pxref{Synchronization}). + +There is no @i{a priori} way to tell what a blocked thread is waiting +for, but a backtrace can help (@pxref{Backtraces}). +@end defvr + +@defvr {Thread State} @code{THREAD_DYING} +The thread will be destroyed by the scheduler after switching to the +next thread. +@end defvr +@end deftypecv + +@deftypecv {Member} {@struct{thread}} {char} name[16] +The thread's name as a string, or at least the first few characters of +it. +@end deftypecv + +@deftypecv {Member} {@struct{thread}} {uint8_t *} stack +Every thread has its own stack to keep track of its state. When the +thread is running, the CPU's stack pointer register tracks the top of +the stack and this member is unused. But when the CPU switches to +another thread, this member saves the thread's stack pointer. No +other members are needed to save the thread's registers, because the +other registers that must be saved are saved on the stack. + +When an interrupt occurs, whether in the kernel or a user program, an +@struct{intr_frame} is pushed onto the stack. When the interrupt occurs +in a user program, the @struct{intr_frame} is always at the very top of +the page. @xref{Interrupt Handling}, for more information. +@end deftypecv + +@deftypecv {Member} {@struct{thread}} {int} priority +A thread priority, ranging from @code{PRI_MIN} (0) to @code{PRI_MAX} +(63). Lower numbers correspond to lower priorities, so that +priority 0 is the lowest priority and priority 63 is the highest. +PintOS, as initially provided, ignores thread priorities, but you will implement +priority scheduling in task 1 (@pxref{Priority Scheduling}). +@end deftypecv + +@deftypecv {Member} {@struct{thread}} {@struct{list_elem}} allelem +This ``list element'' is used to link the thread into the list of all +threads. Each thread is inserted into this list when it is created +and removed when it exits. The @func{thread_foreach} function should +be used to iterate over all threads. +@end deftypecv + +@deftypecv {Member} {@struct{thread}} {@struct{list_elem}} elem +A ``list element'' used to put the thread into doubly linked lists, +either @code{ready_list} (the list of threads ready to run) or a list of +threads waiting on a semaphore in @func{sema_down}. It can do double +duty because a thread waiting on a semaphore is not ready, and vice +versa. +@end deftypecv + +@deftypecv {Member} {@struct{thread}} {uint32_t *} pagedir +Only present in task 2 and later. @xref{Page Tables}. +@end deftypecv + +@deftypecv {Member} {@struct{thread}} {unsigned} magic +Always set to @code{THREAD_MAGIC}, which is just an arbitrary number defined +in @file{threads/thread.c}, and used to detect stack overflow. +@func{thread_current} checks that the @code{magic} member of the running +thread's @struct{thread} is set to @code{THREAD_MAGIC}. Stack overflow +tends to change this value, triggering the assertion. For greatest +benefit, as you add members to @struct{thread}, leave @code{magic} at +the end. +@end deftypecv + +@node Thread Functions +@subsection Thread Functions + +@file{threads/thread.c} implements several public functions for thread +support. Let's take a look at the most useful: + +@deftypefun void thread_init (void) +Called by @func{main} to initialize the thread system. Its main +purpose is to create a @struct{thread} for PintOS's initial thread. +This is possible because the PintOS loader puts the initial +thread's stack at the top of a page, in the same position as any other +PintOS thread. + +Before @func{thread_init} runs, +@func{thread_current} will fail because the running thread's +@code{magic} value is incorrect. Lots of functions call +@func{thread_current} directly or indirectly, including +@func{lock_acquire} for locking a lock, so @func{thread_init} is +called early in PintOS initialization. +@end deftypefun + +@deftypefun void thread_start (void) +Called by @func{main} to start the scheduler. Creates the idle +thread, that is, the thread that is scheduled when no other thread is +ready. Then enables interrupts, which as a side effect enables the +scheduler because the scheduler runs on return from the timer interrupt, using +@func{intr_yield_on_return} (@pxref{External Interrupt Handling}). +@end deftypefun + +@deftypefun void thread_tick (void) +Called by the timer interrupt at each timer tick. It keeps track of +thread statistics and triggers the scheduler when a time slice expires. +@end deftypefun + +@deftypefun void thread_print_stats (void) +Called during PintOS shutdown to print thread statistics. +@end deftypefun + +@deftypefun tid_t thread_create (const char *@var{name}, int @var{priority}, thread_func *@var{func}, void *@var{aux}) +Creates and starts a new thread named @var{name} with the given +@var{priority}, returning the new thread's tid. The thread executes +@var{func}, passing @var{aux} as the function's single argument. + +@func{thread_create} allocates a page for the thread's +@struct{thread} and stack and initializes its members, then it sets +up a set of fake stack frames for it (@pxref{Thread Switching}). The +thread is initialized in the blocked state, then unblocked just before +returning, which allows the new thread to +be scheduled (@pxref{Thread States}). + +@deftp {Type} {void thread_func (void *@var{aux})} +This is the type of the function passed to @func{thread_create}, whose +@var{aux} argument is passed along as the function's argument. +@end deftp +@end deftypefun + +@deftypefun void thread_block (void) +Transitions the running thread from the running state to the blocked +state (@pxref{Thread States}). The thread will not run again until +@func{thread_unblock} is +called on it, so you'd better have some way arranged for that to happen. +Because @func{thread_block} is so low-level, you should prefer to use +one of the synchronization primitives instead (@pxref{Synchronization}). +@end deftypefun + +@deftypefun void thread_unblock (struct thread *@var{thread}) +Transitions @var{thread}, which must be in the blocked state, to the +ready state, allowing it to resume running (@pxref{Thread States}). +This is called when the event that the thread is waiting for occurs, +e.g.@: when the lock that +the thread is waiting on becomes available. +@end deftypefun + +@deftypefun {struct thread *} thread_current (void) +Returns the running thread. +@end deftypefun + +@deftypefun {tid_t} thread_tid (void) +Returns the running thread's thread id. Equivalent to +@code{thread_current ()->tid}. +@end deftypefun + +@deftypefun {const char *} thread_name (void) +Returns the running thread's name. Equivalent to @code{thread_current +()->name}. +@end deftypefun + +@deftypefun void thread_exit (void) @code{NO_RETURN} +Causes the current thread to exit. Never returns, hence +@code{NO_RETURN} (@pxref{Function and Parameter Attributes}). +@end deftypefun + +@deftypefun void thread_yield (void) +Yields the CPU to the scheduler, which picks a new thread to run. The +new thread might be the current thread, so you can't depend on this +function to keep this thread from running for any particular length of +time. +@end deftypefun + +@deftypefun void thread_foreach (thread_action_func *@var{action}, void *@var{aux}) +Iterates over all threads @var{t} and invokes @code{action(t, aux)} on each. +@var{action} must refer to a function that matches the signature +given by @func{thread_action_func}: + +@deftp {Type} {void thread_action_func (struct thread *@var{thread}, void *@var{aux})} +Performs some action on a thread, given @var{aux}. +@end deftp +@end deftypefun + +@deftypefun int thread_get_priority (void) +@deftypefunx void thread_set_priority (int @var{new_priority}) +Stub to set and get thread priority. @xref{Priority Scheduling}. +@end deftypefun + +@deftypefun int thread_get_nice (void) +@deftypefunx void thread_set_nice (int @var{new_nice}) +@deftypefunx int thread_get_recent_cpu (void) +@deftypefunx int thread_get_load_avg (void) +Stubs for the advanced scheduler. @xref{4.4BSD Scheduler}. +@end deftypefun + +@node Thread Switching +@subsection Thread Switching + +@func{schedule} is responsible for switching threads. It +is internal to @file{threads/thread.c} and called only by the three +public thread functions that need to switch threads: +@func{thread_block}, @func{thread_exit}, and @func{thread_yield}. +Before any of these functions call @func{schedule}, they disable +interrupts (or ensure that they are already disabled) and then change +the running thread's state to something other than running. + +@func{schedule} is short but tricky. It records the +current thread in local variable @var{cur}, determines the next thread +to run as local variable @var{next} (by calling +@func{next_thread_to_run}), and then calls @func{switch_threads} to do +the actual thread switch. The thread we switched to was also running +inside @func{switch_threads}, as are all the threads not currently +running, so the new thread now returns out of +@func{switch_threads}, returning the previously running thread. + +@func{switch_threads} is an assembly language routine in +@file{threads/switch.S}. It saves registers on the stack, saves the +CPU's current stack pointer in the current @struct{thread}'s @code{stack} +member, restores the new thread's @code{stack} into the CPU's stack +pointer, restores registers from the stack, and returns. + +The rest of the scheduler is implemented in @func{thread_schedule_tail}. It +marks the new thread as running. If the thread we just switched from +is in the dying state, then it also frees the page that contained the +dying thread's @struct{thread} and stack. These couldn't be freed +prior to the thread switch because the switch needed to use it. + +Running a thread for the first time is a special case. When +@func{thread_create} creates a new thread, it goes through a fair +amount of trouble to get it started properly. In particular, the new +thread hasn't started running yet, so there's no way for it to be +running inside @func{switch_threads} as the scheduler expects. To +solve the problem, @func{thread_create} creates some fake stack frames +in the new thread's stack: + +@itemize @bullet +@item +The topmost fake stack frame is for @func{switch_threads}, represented +by @struct{switch_threads_frame}. The important part of this frame is +its @code{eip} member, the return address. We point @code{eip} to +@func{switch_entry}, indicating it to be the function that called +@func{switch_threads}. + +@item +The next fake stack frame is for @func{switch_entry}, an assembly +language routine in @file{threads/switch.S} that adjusts the stack +pointer,@footnote{This is because @func{switch_threads} takes +arguments on the stack and the 80@var{x}86 SVR4 calling convention +requires the caller, not the called function, to remove them when the +call is complete. See @bibref{SysV-i386} chapter 3 for details.} +calls @func{thread_schedule_tail} (this special case is why +@func{thread_schedule_tail} is separate from @func{schedule}), and returns. +We fill in its stack frame so that it returns into +@func{kernel_thread}, a function in @file{threads/thread.c}. + +@item +The final stack frame is for @func{kernel_thread}, which enables +interrupts and calls the thread's function (the function passed to +@func{thread_create}). If the thread's function returns, it calls +@func{thread_exit} to terminate the thread. +@end itemize + +@node Synchronization +@section Synchronization + +If sharing of resources between threads is not handled in a careful, controlled fashion, the result is usually a big mess. +This is especially the case in operating system kernels, where faulty sharing can crash the entire machine. +PintOS provides several synchronization primitives to help out. + +@cartouche +@noindent@strong{Important:} For the scope of all PintOS tasks, you may assume that any 1, 2 or 4 byte read or write operation on aligned memory is atomic. +All other read or write operations could potentially be interrupted or descheduled. +@end cartouche + +@menu +* Disabling Interrupts:: +* Semaphores:: +* Locks:: +* Monitors:: +* Optimization Barriers:: +@end menu + +@node Disabling Interrupts +@subsection Disabling Interrupts + +The crudest way to do synchronization is to disable interrupts, that +is, to temporarily prevent the CPU from responding to interrupts. If +interrupts are off, no other thread will preempt the running thread, +because thread preemption is driven by the timer interrupt. If +interrupts are on, as they normally are, then the running thread may +be preempted by another at any time, whether between two C statements +or even within the execution of one. + +Incidentally, this means that PintOS is a ``preemptible kernel,'' that +is, kernel threads can be preempted at any time. Traditional Unix +systems are ``nonpreemptible,'' that is, kernel threads can only be +preempted at points where they explicitly call into the scheduler. +(User programs can be preempted at any time in both models.) As you +might imagine, preemptible kernels require more explicit +synchronization. + +You should have little need to set the interrupt state directly. Most +of the time you should use the other synchronization primitives +described in the following sections. The main reason to disable +interrupts is to synchronize kernel threads with external interrupt +handlers, which cannot sleep and thus cannot use most other forms of +synchronization (@pxref{External Interrupt Handling}). + +Some external interrupts cannot be postponed, even by disabling +interrupts. These interrupts, called @dfn{non-maskable interrupts} +(NMIs), are supposed to be used only in emergencies, e.g.@: when the +computer is on fire. PintOS does not handle non-maskable interrupts. + +Types and functions for disabling and enabling interrupts are in +@file{threads/interrupt.h}. + +@deftp Type {enum intr_level} +One of @code{INTR_OFF} or @code{INTR_ON}, denoting that interrupts are +disabled or enabled, respectively. +@end deftp + +@deftypefun {enum intr_level} intr_get_level (void) +Returns the current interrupt state. +@end deftypefun + +@deftypefun {enum intr_level} intr_set_level (enum intr_level @var{level}) +Turns interrupts on or off according to @var{level}. Returns the +previous interrupt state. +@end deftypefun + +@deftypefun {enum intr_level} intr_enable (void) +Turns interrupts on. Returns the previous interrupt state. +@end deftypefun + +@deftypefun {enum intr_level} intr_disable (void) +Turns interrupts off. Returns the previous interrupt state. +@end deftypefun + +@node Semaphores +@subsection Semaphores + +A @dfn{semaphore} is a nonnegative integer together with two operators +that manipulate it atomically, which are: + +@itemize @bullet +@item +``Down'' or ``P'': wait for the value to become positive, then +decrement it. + +@item +``Up'' or ``V'': increment the value (and wake up one waiting thread, +if any). +@end itemize + +A semaphore initialized to 0 may be used to wait for an event +that will happen exactly once. For example, suppose thread @var{A} +starts another thread @var{B} and wants to wait for @var{B} to signal +that some activity is complete. @var{A} can create a semaphore +initialized to 0, pass it to @var{B} as it starts it, and then +``down'' the semaphore. When @var{B} finishes its activity, it +``ups'' the semaphore. This works regardless of whether @var{A} +``downs'' the semaphore or @var{B} ``ups'' it first. + +A semaphore initialized to 1 is typically used for controlling access +to a resource. Before a block of code starts using the resource, it +``downs'' the semaphore, then after it is done with the resource it +``ups'' the resource. In such a case a lock, described below, may be +more appropriate. + +Semaphores can also be initialized to values larger than 1. These are +rarely used. + +Semaphores were invented by Edsger Dijkstra and first used in the THE +operating system (@bibref{Dijkstra}). + +PintOS' semaphore type and operations are declared in +@file{threads/synch.h}. + +@deftp {Type} {struct semaphore} +Represents a semaphore. +@end deftp + +@deftypefun void sema_init (struct semaphore *@var{sema}, unsigned @var{value}) +Initializes @var{sema} as a new semaphore with the given initial +@var{value}. +@end deftypefun + +@deftypefun void sema_down (struct semaphore *@var{sema}) +Executes the ``down'' or ``P'' operation on @var{sema}, waiting for +its value to become positive and then decrementing it by one. +@end deftypefun + +@deftypefun bool sema_try_down (struct semaphore *@var{sema}) +Tries to execute the ``down'' or ``P'' operation on @var{sema}, +without waiting. Returns true if @var{sema} +was successfully decremented, or false if it was already +zero and thus could not be decremented without waiting. Calling this +function in a +tight loop wastes CPU time, so use @func{sema_down} or find a +different approach instead. +@end deftypefun + +@deftypefun void sema_up (struct semaphore *@var{sema}) +Executes the ``up'' or ``V'' operation on @var{sema}, +incrementing its value. If any threads are waiting on +@var{sema}, wakes one of them up. + +Unlike most synchronization primitives, @func{sema_up} may be called +inside an external interrupt handler (@pxref{External Interrupt +Handling}). +@end deftypefun + +Semaphores are internally implemented by disabling interrupts +(@pxref{Disabling Interrupts}) and blocking and unblocking threads +(@func{thread_block} and @func{thread_unblock}). Each semaphore maintains +a list of waiting threads, using the linked list +implementation in @file{lib/kernel/list.c}. + +@node Locks +@subsection Locks + +A @dfn{lock} is like a semaphore with an initial value of 1 +(@pxref{Semaphores}). A lock's equivalent of ``up'' is called +``release'', and the ``down'' operation is called ``acquire''. + +Compared to a semaphore, a lock has one added restriction: only the +thread that acquires a lock, called the lock's ``owner'', is allowed to +release it. If this restriction is a problem, it's a good sign that a +semaphore should be used, instead of a lock. + +Locks in PintOS are not ``recursive,'' that is, it is an error for the +thread currently holding a lock to try to acquire that lock. + +Lock types and functions are declared in @file{threads/synch.h}. + +@deftp {Type} {struct lock} +Represents a lock. +@end deftp + +@deftypefun void lock_init (struct lock *@var{lock}) +Initializes @var{lock} as a new lock. +The lock is not initially owned by any thread. +@end deftypefun + +@deftypefun void lock_acquire (struct lock *@var{lock}) +Acquires @var{lock} for the current thread, first waiting for +any current owner to release it if necessary. +@end deftypefun + +@deftypefun bool lock_try_acquire (struct lock *@var{lock}) +Tries to acquire @var{lock} for use by the current thread, without +waiting. Returns true if successful, false if the lock is already +owned. Calling this function in a tight loop is a bad idea because it +wastes CPU time, so use @func{lock_acquire} instead. +@end deftypefun + +@deftypefun void lock_release (struct lock *@var{lock}) +Releases @var{lock}, which the current thread must own. +@end deftypefun + +@deftypefun bool lock_held_by_current_thread (const struct lock *@var{lock}) +Returns true if the running thread owns @var{lock}, +false otherwise. +There is no function to test whether an arbitrary thread owns a lock, +because the answer could change before the caller could act on it. +@end deftypefun + +@node Monitors +@subsection Monitors + +A @dfn{monitor} is a higher-level form of synchronization than a +semaphore or a lock. A monitor consists of data being synchronized, +plus a lock, called the @dfn{monitor lock}, and one or more +@dfn{condition variables}. Before it accesses the protected data, a +thread first acquires the monitor lock. It is then said to be ``in the +monitor''. While in the monitor, the thread has control over all the +protected data, which it may freely examine or modify. When access to +the protected data is complete, it releases the monitor lock. + +Condition variables allow code in the monitor to wait for a condition to +become true. Each condition variable is associated with an abstract +condition, e.g.@: ``some data has arrived for processing'' or ``over 10 +seconds has passed since the user's last keystroke''. When code in the +monitor needs to wait for a condition to become true, it ``waits'' on +the associated condition variable, which releases the lock and waits for +the condition to be signaled. If, on the other hand, it has caused one +of these conditions to become true, it ``signals'' the condition to wake +up one waiter, or ``broadcasts'' the condition to wake all of them. + +The theoretical framework for monitors was laid out by C.@: A.@: R.@: +Hoare (@bibref{Hoare}). Their practical usage was later elaborated in a +paper on the Mesa operating system (@bibref{Lampson}). + +Condition variable types and functions are declared in +@file{threads/synch.h}. + +@deftp {Type} {struct condition} +Represents a condition variable. +@end deftp + +@deftypefun void cond_init (struct condition *@var{cond}) +Initializes @var{cond} as a new condition variable. +@end deftypefun + +@deftypefun void cond_wait (struct condition *@var{cond}, struct lock *@var{lock}) +Atomically releases @var{lock} (the monitor lock) and waits for +@var{cond} to be signaled by some other piece of code. After +@var{cond} is signaled, reacquires @var{lock} before returning. +@var{lock} must be held before calling this function. + +Sending a signal and waking up from a wait are not an atomic operation. +Thus, typically, @func{cond_wait}'s caller must recheck the condition +after the wait completes and, if necessary, wait again. See the next +section for an example. +@end deftypefun + +@deftypefun void cond_signal (struct condition *@var{cond}, struct lock *@var{lock}) +If any threads are waiting on @var{cond} (protected by monitor lock +@var{lock}), then this function wakes up one of them. If no threads are +waiting, returns without performing any action. +@var{lock} must be held before calling this function. +@end deftypefun + +@deftypefun void cond_broadcast (struct condition *@var{cond}, struct lock *@var{lock}) +Wakes up all threads, if any, waiting on @var{cond} (protected by +monitor lock @var{lock}). @var{lock} must be held before calling this +function. +@end deftypefun + +@subsubsection Monitor Example + +The classical example of a monitor is handling a buffer into which one +or more +``producer'' threads write characters and out of which one or more +``consumer'' threads read characters. To implement this we need, +besides the monitor lock, two condition variables which we will call +@var{not_full} and @var{not_empty}: + +@example +char buf[BUF_SIZE]; /* @r{Buffer.} */ +size_t n = 0; /* @r{0 <= n <= @var{BUF_SIZE}: # of characters in buffer.} */ +size_t head = 0; /* @r{@var{buf} index of next char to write (mod @var{BUF_SIZE}).} */ +size_t tail = 0; /* @r{@var{buf} index of next char to read (mod @var{BUF_SIZE}).} */ +struct lock lock; /* @r{Monitor lock.} */ +struct condition not_empty; /* @r{Signaled when the buffer is not empty.} */ +struct condition not_full; /* @r{Signaled when the buffer is not full.} */ + +@dots{}@r{initialize the locks and condition variables}@dots{} + +void put (char ch) @{ + lock_acquire (&lock); + while (n == BUF_SIZE) @{ /* @r{Can't add to @var{buf} as long as it's full.} */ + cond_wait (¬_full, &lock); + @} + buf[head++ % BUF_SIZE] = ch; /* @r{Add @var{ch} to @var{buf}.} */ + n++; + cond_signal (¬_empty, &lock); /* @r{@var{buf} can't be empty anymore.} */ + lock_release (&lock); +@} + +char get (void) @{ + char ch; + lock_acquire (&lock); + while (n == 0) @{ /* @r{Can't read @var{buf} as long as it's empty.} */ + cond_wait (¬_empty, &lock); + @} + ch = buf[tail++ % BUF_SIZE]; /* @r{Get @var{ch} from @var{buf}.} */ + n--; + cond_signal (¬_full, &lock); /* @r{@var{buf} can't be full anymore.} */ + lock_release (&lock); + return ch; +@} +@end example + +Note that @code{BUF_SIZE} must divide evenly into @code{SIZE_MAX + 1} +for the above code to be completely correct. Otherwise, it will fail +the first time @code{head} wraps around to 0. In practice, +@code{BUF_SIZE} would ordinarily be a power of 2. + +@node Optimization Barriers +@subsection Optimization Barriers + +@c We should try to come up with a better example. +@c Perhaps something with a linked list? + +An @dfn{optimization barrier} is a special statement that prevents the +compiler from making assumptions about the state of memory across the +barrier. The compiler will not reorder reads or writes of variables +across the barrier or assume that a variable's value is unmodified +across the barrier, except for local variables whose address is never +taken. In PintOS, @file{threads/synch.h} defines the @code{barrier()} +macro as an optimization barrier. + +One reason to use an optimization barrier is when data can change +asynchronously, without the compiler's knowledge, e.g.@: by another +thread or an interrupt handler. The @func{too_many_loops} function in +@file{devices/timer.c} is an example. This function starts out by +busy-waiting in a loop until a timer tick occurs: + +@example +/* Wait for a timer tick. */ +int64_t start = ticks; +while (ticks == start) @{ + barrier (); +@} +@end example + +@noindent +Without an optimization barrier in the loop, the compiler could +conclude that the loop would never terminate, because @code{start} and +@code{ticks} start out equal and the loop itself never changes them. +It could then ``optimize'' the function into an infinite loop, which +would definitely be undesirable. + +Optimization barriers can be used to avoid other compiler +optimizations. The @func{busy_wait} function, also in +@file{devices/timer.c}, is an example. It contains this loop: + +@example +while (loops-- > 0) @{ + barrier (); +@} +@end example + +@noindent +The goal of this loop is to busy-wait by counting @code{loops} down +from its original value to 0. Without the barrier, the compiler could +delete the loop entirely, because it produces no useful output and has +no side effects. The barrier forces the compiler to pretend that the +loop body has an important effect. + +Finally, optimization barriers can be used to force the ordering of +memory reads or writes. For example, suppose we add a ``feature'' +that, whenever a timer interrupt occurs, the character in global +variable @code{timer_put_char} is printed on the console, but only if +global Boolean variable @code{timer_do_put} is true. The best way to +set up @samp{x} to be printed is then to use an optimization barrier, +like this: + +@example +timer_put_char = 'x'; +barrier (); +timer_do_put = true; +@end example + +Without the barrier, the code is buggy because the compiler is free to +reorder operations when it doesn't see a reason to keep them in the +same order. In this case, the compiler doesn't know that the order of +assignments is important, so its optimizer is permitted to exchange +their order. There's no telling whether it will actually do this, and +it is possible that passing the compiler different optimization flags +or using a different version of the compiler will produce different +behaviour. + +Another solution is to disable interrupts around the assignments. +This does not prevent reordering, but it prevents the interrupt +handler from intervening between the assignments. It also has the +extra runtime cost of disabling and re-enabling interrupts: + +@example +enum intr_level old_level = intr_disable (); +timer_put_char = 'x'; +timer_do_put = true; +intr_set_level (old_level); +@end example + +A third solution is to mark the declarations of +@code{timer_put_char} and @code{timer_do_put} as @samp{volatile}. This +keyword tells the compiler that the variables are externally observable +and restricts its latitude for optimization. However, the semantics of +@samp{volatile} are not well-defined, so it is not a good general +solution. The base PintOS code does not use @samp{volatile} at all. + +The following is @emph{not} a solution, because locks neither prevent +interrupts nor prevent the compiler from reordering the code within the +region where the lock is held: + +@example +lock_acquire (&timer_lock); /* INCORRECT CODE */ +timer_put_char = 'x'; +timer_do_put = true; +lock_release (&timer_lock); +@end example + +The compiler treats invocation of any function defined externally, +that is, in another source file, as a limited form of optimization +barrier. Specifically, the compiler assumes that any externally +defined function may access any statically or dynamically allocated +data and any local variable whose address is taken. This often means +that explicit barriers can be omitted. It is one reason that PintOS +contains few explicit barriers. + +A function defined in the same source file, or in a header included by +the source file, cannot be relied upon as a optimization barrier. +This applies even to invocation of a function before its +definition, because the compiler may read and parse the entire source +file before performing optimization. + +@node Interrupt Handling +@section Interrupt Handling + +An @dfn{interrupt} notifies the CPU of some event. Much of the work +of an operating system relates to interrupts in one way or another. +For our purposes, we classify interrupts into two broad categories: + +@itemize @bullet +@item +@dfn{Internal interrupts}, that is, interrupts caused directly by CPU +instructions. System calls, attempts at invalid memory access +(@dfn{page faults}), and attempts to divide by zero are some activities +that cause internal interrupts. Because they are caused by CPU +instructions, internal interrupts are @dfn{synchronous} or synchronized +with CPU instructions. @func{intr_disable} does not disable internal +interrupts. + +@item +@dfn{External interrupts}, that is, interrupts originating outside the +CPU. These interrupts come from hardware devices such as the system +timer, keyboard, serial ports, and disks. External interrupts are +@dfn{asynchronous}, meaning that their delivery is not +synchronized with instruction execution. Handling of external interrupts +can be postponed with @func{intr_disable} and related functions +(@pxref{Disabling Interrupts}). +@end itemize + +The CPU treats both classes of interrupts largely the same way, +so PintOS has common infrastructure to handle both classes. +The following section describes this +common infrastructure. The sections after that give the specifics of +external and internal interrupts. + +If you haven't already read chapter 3, ``Basic Execution Environment,'' +in @bibref{IA32-v1}, it is recommended that you do so now. You might +also want to skim chapter 5, ``Interrupt and Exception Handling,'' in +@bibref{IA32-v3a}. + +@menu +* Interrupt Infrastructure:: +* Internal Interrupt Handling:: +* External Interrupt Handling:: +@end menu + +@node Interrupt Infrastructure +@subsection Interrupt Infrastructure + +When an interrupt occurs, the CPU saves +its most essential state on the current stack (determined by esp) +and jumps to an interrupt handler routine. +The 80@var{x}86 architecture supports 256 +interrupts, numbered 0 through 255, each with an independent +handler defined in an array called the @dfn{interrupt +descriptor table} or IDT. + +In PintOS, @func{intr_init} in @file{threads/interrupt.c} sets up the +IDT so that each entry points to a unique entry point in +@file{threads/intr-stubs.S} named @func{intr@var{NN}_stub}, where +@var{NN} is the interrupt number in +hexadecimal. Because the CPU doesn't give +us any other way to find out the interrupt number, this entry point +pushes the interrupt number on the stack. Then it jumps to +@func{intr_entry}, which pushes all the registers that the processor +didn't already push for us, and then calls @func{intr_handler}, which +brings us back into C in @file{threads/interrupt.c}. + +The main job of @func{intr_handler} is to call the function +registered for handling the particular interrupt. (If no +function is registered, it dumps some information to the console and +panics.) It also does some extra processing for external +interrupts (@pxref{External Interrupt Handling}). + +When @func{intr_handler} returns, the assembly code in +@file{threads/intr-stubs.S} restores all the CPU registers saved +earlier and directs the CPU to return from the interrupt. + +The following types and functions are common to all interrupts: + +@deftp {Type} {void intr_handler_func (struct intr_frame *@var{frame})} +This is how an interrupt handler function must be declared. Its @var{frame} +argument (see below) allows it to determine the cause of the interrupt +and the state of the thread that was interrupted. +@end deftp + +@deftp {Type} {struct intr_frame} +The stack frame of an interrupt handler, as saved by the CPU, the interrupt +stubs, and @func{intr_entry}. Its most interesting members are described +below. +@end deftp + +@deftypecv {Member} {@struct{intr_frame}} uint32_t edi +@deftypecvx {Member} {@struct{intr_frame}} uint32_t esi +@deftypecvx {Member} {@struct{intr_frame}} uint32_t ebp +@deftypecvx {Member} {@struct{intr_frame}} uint32_t esp_dummy +@deftypecvx {Member} {@struct{intr_frame}} uint32_t ebx +@deftypecvx {Member} {@struct{intr_frame}} uint32_t edx +@deftypecvx {Member} {@struct{intr_frame}} uint32_t ecx +@deftypecvx {Member} {@struct{intr_frame}} uint32_t eax +@deftypecvx {Member} {@struct{intr_frame}} uint16_t es +@deftypecvx {Member} {@struct{intr_frame}} uint16_t ds +Register values in the interrupted thread, pushed by @func{intr_entry}. +The @code{esp_dummy} value isn't actually used (refer to the +description of @code{PUSHA} in @bibref{IA32-v2b} for details). +@end deftypecv + +@deftypecv {Member} {@struct{intr_frame}} uint32_t vec_no +The interrupt vector number, ranging from 0 to 255. +@end deftypecv + +@deftypecv {Member} {@struct{intr_frame}} uint32_t error_code +The ``error code'' pushed on the stack by the CPU for some internal +interrupts. +@end deftypecv + +@deftypecv {Member} {@struct{intr_frame}} void (*eip) (void) +The address of the next instruction to be executed by the interrupted +thread. +@end deftypecv + +@deftypecv {Member} {@struct{intr_frame}} {void *} esp +The interrupted thread's stack pointer. +@end deftypecv + +@deftypefun {const char *} intr_name (uint8_t @var{vec}) +Returns the name of the interrupt numbered @var{vec}, or +@code{"unknown"} if the interrupt has no registered name. +@end deftypefun + +@node Internal Interrupt Handling +@subsection Internal Interrupt Handling + +Internal interrupts are caused directly by CPU instructions executed by +the running kernel thread or user process (from task 2 onward). An +internal interrupt is therefore said to arise in a ``process context.'' + +In an internal interrupt's handler, it can make sense to examine the +@struct{intr_frame} passed to the interrupt handler, or even to modify +it. When the interrupt returns, modifications in @struct{intr_frame} +become changes to the calling thread or process's state. For example, +the PintOS system call handler returns a value to the user program by +modifying the saved EAX register (@pxref{System Call Details}). + +There are no special restrictions on what an internal interrupt +handler can or can't do. Generally they should run with interrupts +enabled, just like other code, so they can be preempted by other +kernel threads. Thus, they do need to synchronize with other threads +on shared data and other resources (@pxref{Synchronization}). Of course, this +only makes sense if they are not updating critical system data at the time. + +Internal interrupt handlers can be invoked recursively. For example, +the system call handler might cause a page fault while attempting to +read user memory. Deep recursion would risk overflowing the limited +kernel stack (@pxref{struct thread}), but should be unnecessary. + +@deftypefun void intr_register_int (uint8_t @var{vec}, int @var{dpl}, enum intr_level @var{level}, intr_handler_func *@var{handler}, const char *@var{name}) +Registers @var{handler} to be called when internal interrupt numbered +@var{vec} is triggered. Names the interrupt @var{name} for debugging +purposes. + +If @var{level} is @code{INTR_ON}, external interrupts will be processed +normally during the interrupt handler's execution, which is normally +desirable. Specifying @code{INTR_OFF} will cause the CPU to disable +external interrupts when it invokes the interrupt handler. The effect +is slightly different from calling @func{intr_disable} inside the +handler, because that leaves a window of one or more CPU instructions in +which external interrupts are still enabled. This is important for the +page fault handler; refer to the comments in @file{userprog/exception.c} +for details. + +@var{dpl} determines how the interrupt can be invoked. If @var{dpl} is +0, then the interrupt can be invoked only by kernel threads. Otherwise +@var{dpl} should be 3, which allows user processes to invoke the +interrupt with an explicit INT instruction. The value of @var{dpl} +doesn't affect user processes' ability to invoke the interrupt +indirectly, e.g.@: an invalid memory reference will cause a page fault +regardless of @var{dpl}. +@end deftypefun + +@node External Interrupt Handling +@subsection External Interrupt Handling + +External interrupts are caused by events outside the CPU. +They are asynchronous, so they can be invoked at any time that +interrupts have not been disabled. We say that an external interrupt +runs in an ``interrupt context.'' + +In an external interrupt, the @struct{intr_frame} passed to the +handler is not very meaningful. It describes the state of the thread +or process that was interrupted, but there is no way to predict which +one that is. It is possible, although rarely useful, to examine it, but +modifying it is a recipe for disaster. + +Only one external interrupt may be processed at a time. Neither +internal nor external interrupt may nest within an external interrupt +handler. Thus, an external interrupt's handler must run with interrupts +disabled (@pxref{Disabling Interrupts}). + +An external interrupt handler must not sleep or yield, which rules out +calling @func{lock_acquire}, @func{thread_yield}, and many other +functions. Sleeping in interrupt context would effectively put the +interrupted thread to sleep, too, until the interrupt handler was again +scheduled and returned. This would be unfair to the unlucky thread, and +it would deadlock if the handler were waiting for the sleeping thread +to, e.g., release a lock. + +An external interrupt handler effectively monopolizes the machine and delays +all other activities. Therefore, external interrupt handlers should complete +as quickly as they can. Anything that requires a significant amount of CPU +time should instead run in a kernel thread, possibly one that the interrupt +triggers using a synchronization primitive. + +External interrupts are controlled by a +pair of devices outside the CPU called @dfn{programmable interrupt +controllers}, @dfn{PICs} for short. When @func{intr_init} sets up the +CPU's IDT, it also initializes the PICs for interrupt handling. The +PICs also must be ``acknowledged'' at the end of processing for each +external interrupt. @func{intr_handler} takes care of that by calling +@func{pic_end_of_interrupt}, which properly signals the PICs. + +The following functions relate to external interrupts: + +@deftypefun void intr_register_ext (uint8_t @var{vec}, intr_handler_func *@var{handler}, const char *@var{name}) +Registers @var{handler} to be called when external interrupt numbered +@var{vec} is triggered. Names the interrupt @var{name} for debugging +purposes. The handler will run with interrupts disabled. +@end deftypefun + +@deftypefun bool intr_context (void) +Returns true if we are running in an interrupt context, otherwise +false. Mainly used in functions that might sleep +or that otherwise should not be called from interrupt context, in this +form: +@example +ASSERT (!intr_context ()); +@end example +@end deftypefun + +@deftypefun void intr_yield_on_return (void) +When called in an interrupt context, causes @func{thread_yield} to be +called just before the interrupt returns. Used +in the timer interrupt handler when a thread's time slice expires, to +cause a new thread to be scheduled. +@end deftypefun + +@node Memory Allocation +@section Memory Allocation + +PintOS contains two memory allocators, one that allocates memory in +units of a page, and one that can allocate blocks of any size. + +@menu +* Page Allocator:: +* Block Allocator:: +@end menu + +@node Page Allocator +@subsection Page Allocator + +The page allocator declared in @file{threads/palloc.h} allocates +memory in units of a page. It is most often used to allocate memory +one page at a time, but it can also allocate multiple contiguous pages +at once. + +The page allocator divides the memory it allocates into two pools, +called the kernel and user pools. By default, each pool gets half of +system memory above @w{1 MB}, but the division can be changed with the +@option{-ul} kernel +command line +option (@pxref{Why PAL_USER?}). An allocation request draws from one +pool or the other. If one pool becomes empty, the other may still +have free pages. The user pool should be used for allocating memory +for user processes and the kernel pool for all other allocations. +This will only become important starting with task 3. Until then, +all allocations should be made from the kernel pool. + +Each pool's usage is tracked with a bitmap, one bit per page in +the pool. A request to allocate @var{n} pages scans the bitmap +for @var{n} consecutive bits set to +false, indicating that those pages are free, and then sets those bits +to true to mark them as used. This is a ``first fit'' allocation +strategy (@pxref{Wilson}). + +The page allocator is subject to fragmentation. That is, it may not +be possible to allocate @var{n} contiguous pages even though @var{n} +or more pages are free, because the free pages are separated by used +pages. In fact, in pathological cases it may be impossible to +allocate 2 contiguous pages even though half of the pool's pages are free. +Single-page requests can't fail due to fragmentation, so +requests for multiple contiguous pages should be limited as much as +possible. + +Pages may not be allocated from interrupt context, but they may be +freed. + +When a page is freed, all of its bytes are cleared to @t{0xcc}, as +a debugging aid (@pxref{Debugging Tips}). + +Page allocator types and functions are described below: + +@deftypefun {void *} palloc_get_page (enum palloc_flags @var{flags}) +@deftypefunx {void *} palloc_get_multiple (enum palloc_flags @var{flags}, size_t @var{page_cnt}) +Obtains and returns one page, or @var{page_cnt} contiguous pages, +respectively. Returns a null pointer if the pages cannot be allocated. + +The @var{flags} argument may be any combination of the following flags: + +@defvr {Page Allocator Flag} @code{PAL_ASSERT} +If the pages cannot be allocated, panic the kernel. This is only +appropriate during kernel initialization. User processes +should never be permitted to panic the kernel. +@end defvr + +@defvr {Page Allocator Flag} @code{PAL_ZERO} +Zero all the bytes in the allocated pages before returning them. If not +set, the contents of newly allocated pages are unpredictable. +@end defvr + +@defvr {Page Allocator Flag} @code{PAL_USER} +Obtain the pages from the user pool. If not set, pages are allocated +from the kernel pool. +@end defvr +@end deftypefun + +@deftypefun void palloc_free_page (void *@var{page}) +@deftypefunx void palloc_free_multiple (void *@var{pages}, size_t @var{page_cnt}) +Frees one page, or @var{page_cnt} contiguous pages, respectively, +starting at @var{pages}. All of the pages must have been obtained using +@func{palloc_get_page} or @func{palloc_get_multiple}. +@end deftypefun + +@node Block Allocator +@subsection Block Allocator + +The block allocator, declared in @file{threads/malloc.h}, can allocate +blocks of any size. It is layered on top of the page allocator +described in the previous section. Blocks returned by the block +allocator are obtained from the kernel pool. + +The block allocator uses two different strategies for allocating memory. +The first strategy applies to blocks that are 1 kB or smaller +(one-fourth of the page size). These allocations are rounded up to the +nearest power of 2, or 16 bytes, whichever is larger. Then they are +grouped into a page used only for allocations of that size. + +The second strategy applies to blocks larger than 1 kB. +These allocations (plus a small amount of overhead) are rounded up to +the nearest page in size, and then the block allocator requests that +number of contiguous pages from the page allocator. + +In either case, the difference between the allocation requested size +and the actual block size is wasted. A real operating system would +carefully tune its allocator to minimize this waste, but this is +unimportant in an instructional system like PintOS. + +As long as a page can be obtained from the page allocator, small +allocations always succeed. Most small allocations do not require a +new page from the page allocator at all, because they are satisfied +using part of a page already allocated. However, large allocations +always require calling into the page allocator, and any allocation +that needs more than one contiguous page can fail due to fragmentation, +as already discussed in the previous section. Thus, you should +minimize the number of large allocations in your code, especially +those over approximately 4 kB each. + +When a block is freed, all of its bytes are cleared to @t{0xcc}, as +a debugging aid (@pxref{Debugging Tips}). + +The block allocator may not be called from interrupt context. + +The block allocator functions are described below. Their interfaces are +the same as the standard C library functions of the same names. + +@deftypefun {void *} malloc (size_t @var{size}) +Obtains and returns a new block, from the kernel pool, at least +@var{size} bytes long. Returns a null pointer if @var{size} is zero or +if memory is not available. +@end deftypefun + +@deftypefun {void *} calloc (size_t @var{a}, size_t @var{b}) +Obtains a returns a new block, from the kernel pool, at least +@code{@var{a} * @var{b}} bytes long. The block's contents will be +cleared to zeros. Returns a null pointer if @var{a} or @var{b} is zero +or if insufficient memory is available. +@end deftypefun + +@deftypefun {void *} realloc (void *@var{block}, size_t @var{new_size}) +Attempts to resize @var{block} to @var{new_size} bytes, possibly moving +it in the process. If successful, returns the new block, in which case +the old block must no longer be accessed. On failure, returns a null +pointer, and the old block remains valid. + +A call with @var{block} null is equivalent to @func{malloc}. A call +with @var{new_size} zero is equivalent to @func{free}. +@end deftypefun + +@deftypefun void free (void *@var{block}) +Frees @var{block}, which must have been previously returned by +@func{malloc}, @func{calloc}, or @func{realloc} (and not yet freed). +@end deftypefun + +@node Virtual Addresses +@section Virtual Addresses + +A 32-bit virtual address can be divided into a 20-bit @dfn{page number} +and a 12-bit @dfn{page offset} (or just @dfn{offset}), like this: + +@example +@group + 31 12 11 0 + +-------------------+-----------+ + | Page Number | Offset | + +-------------------+-----------+ + Virtual Address +@end group +@end example + +Header @file{threads/vaddr.h} defines these functions and macros for +working with virtual addresses: + +@defmac PGSHIFT +@defmacx PGBITS +The bit index (0) and number of bits (12) of the offset part of a +virtual address, respectively. +@end defmac + +@defmac PGMASK +A bit mask with the bits in the page offset set to 1, the rest set to 0 +(@t{0xfff}). +@end defmac + +@defmac PGSIZE +The page size in bytes (4,096). +@end defmac + +@deftypefun unsigned pg_ofs (const void *@var{va}) +Extracts and returns the page offset in virtual address @var{va}. +@end deftypefun + +@deftypefun uintptr_t pg_no (const void *@var{va}) +Extracts and returns the page number in virtual address @var{va}. +@end deftypefun + +@deftypefun {void *} pg_round_down (const void *@var{va}) +Returns the start of the virtual page that @var{va} points within, that +is, @var{va} with the page offset set to 0. +@end deftypefun + +@deftypefun {void *} pg_round_up (const void *@var{va}) +Returns @var{va} rounded up to the nearest page boundary. +@end deftypefun + +Virtual memory in PintOS is divided into two regions: user virtual +memory and kernel virtual memory (@pxref{Virtual Memory Layout}). The +boundary between them is @code{PHYS_BASE}: + +@defmac PHYS_BASE +Base address of kernel virtual memory. It defaults to @t{0xc0000000} (3 +GB), but it may be changed to any multiple of @t{0x10000000} from +@t{0x80000000} to @t{0xf0000000}. + +User virtual memory ranges from virtual address 0 up to +@code{PHYS_BASE}. Kernel virtual memory occupies the rest of the +virtual address space, from @code{PHYS_BASE} up to 4 GB. +@end defmac + +@deftypefun {bool} is_user_vaddr (const void *@var{va}) +@deftypefunx {bool} is_kernel_vaddr (const void *@var{va}) +Returns true if @var{va} is a user or kernel virtual address, +respectively, false otherwise. +@end deftypefun + +The 80@var{x}86 architecture doesn't provide any way to directly access memory given +a physical address. This ability is often necessary in an operating +system kernel, so PintOS works around it by mapping kernel virtual +memory one-to-one to physical memory. That is, virtual address +@code{PHYS_BASE} accesses physical address 0, virtual address +@code{PHYS_BASE} + @t{0x1234} accesses physical address @t{0x1234}, and +so on up to the size of the machine's physical memory. Thus, adding +@code{PHYS_BASE} to a physical address obtains a kernel virtual address +that accesses that address; conversely, subtracting @code{PHYS_BASE} +from a kernel virtual address obtains the corresponding physical +address. Header @file{threads/vaddr.h} provides a pair of functions to +do these translations: + +@deftypefun {void *} ptov (uintptr_t @var{pa}) +Returns the kernel virtual address corresponding to physical address +@var{pa}, which should be between 0 and the number of bytes of physical +memory. +@end deftypefun + +@deftypefun {uintptr_t} vtop (void *@var{va}) +Returns the physical address corresponding to @var{va}, which must be a +kernel virtual address. +@end deftypefun + +@node Page Table +@section Page Table + +The code in @file{pagedir.c} is an abstract interface to the 80@var{x}86 +hardware page table, also called a ``page directory'' by Intel processor +documentation. The page table interface uses a @code{uint32_t *} to +represent a page table because this is convenient for accessing their +internal structure. + +The sections below describe the page table interface and internals. + +@menu +* Page Table Creation Destruction Activation:: +* Page Tables Inspection and Updates:: +* Page Table Accessed and Dirty Bits:: +* Page Table Details:: +@end menu + +@node Page Table Creation Destruction Activation +@subsection Creation, Destruction, and Activation + +These functions create, destroy, and activate page tables. The base +PintOS code already calls these functions where necessary, so it should +not be necessary to call them yourself. + +@deftypefun {uint32_t *} pagedir_create (void) +Creates and returns a new page table. The new page table contains +PintOS's normal kernel virtual page mappings, but no user virtual +mappings. + +Returns a null pointer if memory cannot be obtained. +@end deftypefun + +@deftypefun void pagedir_destroy (uint32_t *@var{pd}) +Frees all of the resources held by @var{pd}, including the page table +itself and the frames that it maps. +@end deftypefun + +@deftypefun void pagedir_activate (uint32_t *@var{pd}) +Activates @var{pd}. The active page table is the one used by the CPU to +translate memory references. +@end deftypefun + +@node Page Tables Inspection and Updates +@subsection Inspection and Updates + +These functions examine or update the mappings from pages to frames +encapsulated by a page table. They work on both active and inactive +page tables (that is, those for running and suspended processes), +flushing the TLB as necessary. + +@deftypefun bool pagedir_set_page (uint32_t *@var{pd}, void *@var{upage}, void *@var{kpage}, bool @var{writable}) +Adds to @var{pd} a mapping from user page @var{upage} to the frame identified +by kernel virtual address @var{kpage}. If @var{writable} is true, the +page is mapped read/write; otherwise, it is mapped read-only. + +User page @var{upage} must not already be mapped in @var{pd}. + +Kernel page @var{kpage} should be a kernel virtual address obtained from +the user pool with @code{palloc_get_page(PAL_USER)} (@pxref{Why +PAL_USER?}). + +Returns true if successful, false on failure. Failure will occur if +additional memory required for the page table cannot be obtained. +@end deftypefun + +@deftypefun {void *} pagedir_get_page (uint32_t *@var{pd}, const void *@var{uaddr}) +Looks up the frame mapped to @var{uaddr} in @var{pd}. Returns the +kernel virtual address for that frame, if @var{uaddr} is mapped, or a +null pointer if it is not. +@end deftypefun + +@deftypefun void pagedir_clear_page (uint32_t *@var{pd}, void *@var{page}) +Marks @var{page} ``not present'' in @var{pd}. Later accesses to +the page will fault. + +Other bits in the page table for @var{page} are preserved, permitting +the accessed and dirty bits (see the next section) to be checked. + +This function has no effect if @var{page} is not mapped. +@end deftypefun + +@node Page Table Accessed and Dirty Bits +@subsection Accessed and Dirty Bits + +80@var{x}86 hardware provides some assistance for implementing page +replacement algorithms, through a pair of bits in the page table entry +(PTE) for each page. On any read or write to a page, the CPU sets the +@dfn{accessed bit} to 1 in the page's PTE, and on any write, the CPU +sets the @dfn{dirty bit} to 1. The CPU never resets these bits to 0, +but the OS may do so. + +Proper interpretation of these bits requires understanding of +@dfn{aliases}, that is, two (or more) pages that refer to the same +frame. When an aliased frame is accessed, the accessed and dirty bits +are updated in only one page table entry (the one for the page used for +access). The accessed and dirty bits for the other aliases are not +updated. + +@xref{Accessed and Dirty Bits}, on applying these bits in implementing +page replacement algorithms. + +@deftypefun bool pagedir_is_dirty (uint32_t *@var{pd}, const void *@var{page}) +@deftypefunx bool pagedir_is_accessed (uint32_t *@var{pd}, const void *@var{page}) +Returns true if page directory @var{pd} contains a page table entry for +@var{page} that is marked dirty (or accessed). Otherwise, +returns false. +@end deftypefun + +@deftypefun void pagedir_set_dirty (uint32_t *@var{pd}, const void *@var{page}, bool @var{value}) +@deftypefunx void pagedir_set_accessed (uint32_t *@var{pd}, const void *@var{page}, bool @var{value}) +If page directory @var{pd} has a page table entry for @var{page}, then +its dirty (or accessed) bit is set to @var{value}. +@end deftypefun + +@node Page Table Details +@subsection Page Table Details + +The functions provided with PintOS are sufficient to implement the +tasks. However, you may still find it worthwhile to understand the +hardware page table format, so we'll go into a little detail in this +section. + +@menu +* Page Table Structure:: +* Page Table Entry Format:: +* Page Directory Entry Format:: +@end menu + +@node Page Table Structure +@subsubsection Structure + +The top-level paging data structure is a page called the ``page +directory'' (PD) arranged as an array of 1,024 32-bit page directory +entries (PDEs), each of which represents 4 MB of virtual memory. Each +PDE may point to the physical address of another page called a +``page table'' (PT) arranged, similarly, as an array of 1,024 +32-bit page table entries (PTEs), each of which translates a single 4 +kB virtual page to a physical page. + +Translation of a virtual address into a physical address follows +the three-step process illustrated in the diagram +below:@footnote{Actually, virtual to physical translation on the +80@var{x}86 architecture occurs via an intermediate ``linear +address,'' but PintOS (and most modern 80@var{x}86 OSes) set up the CPU +so that linear and virtual addresses are one and the same. Thus, you +can effectively ignore this CPU feature.} + +@enumerate 1 +@item +The most-significant 10 bits of the virtual address (bits 22@dots{}31) +index the page directory. If the PDE is marked ``present,'' the +physical address of a page table is read from the PDE thus obtained. +If the PDE is marked ``not present'' then a page fault occurs. + +@item +The next 10 bits of the virtual address (bits 12@dots{}21) index +the page table. If the PTE is marked ``present,'' the physical +address of a data page is read from the PTE thus obtained. If the PTE +is marked ``not present'' then a page fault occurs. + +@item +The least-significant 12 bits of the virtual address (bits 0@dots{}11) +are added to the data page's physical base address, yielding the final +physical address. +@end enumerate + +@example +@group + 31 22 21 12 11 0 ++----------------------+----------------------+----------------------+ +| Page Directory Index | Page Table Index | Page Offset | ++----------------------+----------------------+----------------------+ + | | | + _______/ _______/ _____/ + / / / + / Page Directory / Page Table / Data Page + / .____________. / .____________. / .____________. + |1,023|____________| |1,023|____________| | |____________| + |1,022|____________| |1,022|____________| | |____________| + |1,021|____________| |1,021|____________| \__\|____________| + |1,020|____________| |1,020|____________| /|____________| + | | | | | | | | + | | | \____\| |_ | | + | | . | /| . | \ | . | + \____\| . |_ | . | | | . | + /| . | \ | . | | | . | + | . | | | . | | | . | + | | | | | | | | + |____________| | |____________| | |____________| + 4|____________| | 4|____________| | |____________| + 3|____________| | 3|____________| | |____________| + 2|____________| | 2|____________| | |____________| + 1|____________| | 1|____________| | |____________| + 0|____________| \__\0|____________| \____\|____________| + / / +@end group +@end example + +PintOS provides some macros and functions that are useful for working +with raw page tables: + +@defmac PTSHIFT +@defmacx PTBITS +The starting bit index (12) and number of bits (10), respectively, in a +page table index. +@end defmac + +@defmac PTMASK +A bit mask with the bits in the page table index set to 1 and the rest +set to 0 (@t{0x3ff000}). +@end defmac + +@defmac PTSPAN +The number of bytes of virtual address space that a single page table +page covers (4,194,304 bytes, or 4 MB). +@end defmac + +@defmac PDSHIFT +@defmacx PDBITS +The starting bit index (22) and number of bits (10), respectively, in a +page directory index. +@end defmac + +@defmac PDMASK +A bit mask with the bits in the page directory index set to 1 and other +bits set to 0 (@t{0xffc00000}). +@end defmac + +@deftypefun uintptr_t pd_no (const void *@var{va}) +@deftypefunx uintptr_t pt_no (const void *@var{va}) +Returns the page directory index or page table index, respectively, for +virtual address @var{va}. These functions are defined in +@file{threads/pte.h}. +@end deftypefun + +@deftypefun unsigned pg_ofs (const void *@var{va}) +Returns the page offset for virtual address @var{va}. This function is +defined in @file{threads/vaddr.h}. +@end deftypefun + +@node Page Table Entry Format +@subsubsection Page Table Entry Format + +You do not need to understand the PTE format to do the PintOS +tasks, unless you wish to incorporate the page table into your +supplemental page table (@pxref{Managing the Supplemental Page Table}). + +The actual format of a page table entry is summarized below. For +complete information, refer to section 3.7, ``Page Translation Using +32-Bit Physical Addressing,'' in @bibref{IA32-v3a}. + +@example +@group + 31 12 11 9 6 5 2 1 0 ++---------------------------------------+----+----+-+-+---+-+-+-+ +| Physical Address | AVL| |D|A| |U|W|P| ++---------------------------------------+----+----+-+-+---+-+-+-+ +@end group +@end example + +Some more information on each bit is given below. The names are +@file{threads/pte.h} macros that represent the bits' values: + +@defmac PTE_P +Bit 0, the ``present'' bit. When this bit is 1, the +other bits are interpreted as described below. When this bit is 0, any +attempt to access the page will page fault. The remaining bits are then +not used by the CPU and may be used by the OS for any purpose. +@end defmac + +@defmac PTE_W +Bit 1, the ``read/write'' bit. When it is 1, the page +is writable. When it is 0, write attempts will page fault. +@end defmac + +@defmac PTE_U +Bit 2, the ``user/supervisor'' bit. When it is 1, user +processes may access the page. When it is 0, only the kernel may access +the page (user accesses will page fault). + +PintOS clears this bit in PTEs for kernel virtual memory, to prevent +user processes from accessing them. +@end defmac + +@defmac PTE_A +Bit 5, the ``accessed'' bit. @xref{Page Table Accessed +and Dirty Bits}. +@end defmac + +@defmac PTE_D +Bit 6, the ``dirty'' bit. @xref{Page Table Accessed and +Dirty Bits}. +@end defmac + +@defmac PTE_AVL +Bits 9@dots{}11, available for operating system use. +PintOS, as provided, does not use them and sets them to 0. +@end defmac + +@defmac PTE_ADDR +Bits 12@dots{}31, the top 20 bits of the physical address of a frame. +The low 12 bits of the frame's address are always 0. +@end defmac + +The other bits are either reserved or uninteresting in a PintOS context and +should be set to@tie{}0. + +Header @file{threads/pte.h} defines three functions for working with +page table entries: + +@deftypefun uint32_t pte_create_kernel (uint32_t *@var{page}, bool @var{writable}) +Returns a page table entry that points to @var{page}, which should be a +kernel virtual address. The PTE's present bit will be set. It will be +marked for kernel-only access. If @var{writable} is true, the PTE will +also be marked read/write; otherwise, it will be read-only. +@end deftypefun + +@deftypefun uint32_t pte_create_user (uint32_t *@var{page}, bool @var{writable}) +Returns a page table entry that points to @var{page}, which should be +the kernel virtual address of a frame in the user pool (@pxref{Why +PAL_USER?}). The PTE's present bit will be set and it will be marked to +allow user-mode access. If @var{writable} is true, the PTE will also be +marked read/write; otherwise, it will be read-only. +@end deftypefun + +@deftypefun {void *} pte_get_page (uint32_t @var{pte}) +Returns the kernel virtual address for the frame that @var{pte} points +to. The @var{pte} may be present or not-present; if it is not-present +then the pointer returned is only meaningful if the address bits in the PTE +actually represent a physical address. +@end deftypefun + +@node Page Directory Entry Format +@subsubsection Page Directory Entry Format + +Page directory entries have the same format as PTEs, except that the +physical address points to a page table page instead of a frame. Header +@file{threads/pte.h} defines two functions for working with page +directory entries: + +@deftypefun uint32_t pde_create (uint32_t *@var{pt}) +Returns a page directory that points to @var{page}, which should be the +kernel virtual address of a page table page. The PDE's present bit will +be set, it will be marked to allow user-mode access, and it will be +marked read/write. +@end deftypefun + +@deftypefun {uint32_t *} pde_get_pt (uint32_t @var{pde}) +Returns the kernel virtual address for the page table page that +@var{pde}, which must be marked present, points to. +@end deftypefun + +@node Linked List +@section Linked List + +PintOS provides a (doubly) linked list data structure in @file{lib/kernel/list.c}. +When used, the header file @file{lib/kernel/list.h} needs to be included with with @code{#include <list.h>}. +This is often already done for you, as PintOS already uses this linked list structure in several places +(such as the @code{ready_list} in @file{src/threads/thread.c} and semaphore @code{waiters} in @file{src/threads/sync.h}). + +@menu +* List Data Types:: +* Basic List Functions:: +* List Traversal Functions:: +* List Insertion Functions:: +* List Removal Functions:: +* Ordered List Operations:: +* List Example:: +* List Auxiliary Data:: +* List Synchronisation:: +@end menu + +@node List Data Types +@subsection Data Types + +The PintOS implementation of a doubly linked list does not require use of dynamically allocated memory. +Instead, each structure that is a potential list element must embed a @code{struct list_elem} member. +All of the list functions operate on these @code{struct list_elem}'s. +The @code{list_entry} macro allows conversion from a @code{struct list_elem} back to a structure object that contains it. + +A linked list is represented by @struct{list}. + +@deftp {Type} {struct list} +Represents an entire linked list. The actual members of @struct{list} are ``opaque.'' +That is, code that uses a linked list should not access @struct{list} members directly, nor should it need to. +Instead, use list functions and macros. +@end deftp + +Internally, these lists have two sentinel elements: the "head" just before the first element and the "tail" just after the last element. +The @var{prev} link of the head sentinel is null, as is the @var{next} link of the tail sentinel. +Their other two links point toward each other via the interior elements of the list. + +An empty list looks like this: + +@example +@group + +------+ +------+ + <---| head |<--->| tail |---> + +------+ +------+ +@end group +@end example + +A list with two elements in it looks like this: + +@example +@group + +------+ +-------+ +-------+ +------+ + <---| head |<--->| 1 |<--->| 2 |<--->| tail |---> + +------+ +-------+ +-------+ +------+ +@end group +@end example + +The symmetry of this arrangement eliminates a lot of special cases in list processing. + +@page +The linked list operates on elements of type @struct{list_elem}. + +@deftp {Type} {struct list_elem} +Embed a @struct{list_elem} member in the structure you want to include in a linked list. +Like @struct{list}, @struct{list_elem} is opaque. +All functions for operating on linked list elements actually take and return pointers to @struct{list_elem}, +not pointers to your linked list's real element type. +@end deftp + +You will often need to obtain a @struct{list_elem} given a real element of the linked list, and vice versa. +Given a real element of the linked list, you may use the @samp{&} operator to obtain a pointer to its @struct{list_elem}. +Use the @code{list_entry()} macro to go the other direction. + +@deftypefn {Macro} {@var{type} *} list_entry (struct list_elem *@var{elem}, @var{type}, @var{member}) +Returns a pointer to the structure that @var{elem}, a pointer to a @struct{list_elem}, is embedded within. +You must provide @var{type}, the name of the structure that @var{elem} is inside, and @var{member}, the name of the member in @var{type} that @var{elem} points to. + +For example, suppose @code{l} is a @code{struct list_elem *} variable that points to a @struct{thread} member (of type @struct{list_elem}) named @code{l_elem}. +Then, @code{list_entry@tie{}(l, struct thread, l_elem)} yields the address of the @struct{thread} that @code{l} points within. +@end deftypefn + +@xref{List Example}, for an example. + +@node Basic List Functions +@subsection Basic Functions + +These functions create linked lists and inspect their properties. + +@deftypefun void list_init (struct list *@var{list}) +Initializes @var{list} as an empty linked list. +@end deftypefun + +@deftypefun size_t list_size (struct list *@var{list}) +Returns the number of elements currently stored in @var{list}. +@end deftypefun + +@deftypefun bool list_empty (struct list *@var{list}) +Returns true if @var{list} currently contains no elements, +false if @var{list} contains at least one element. +@end deftypefun + +@node List Traversal Functions +@subsection Traversal Functions + +Each of these functions allows for the traversal of a linked list. + +@deftypefun struct list_elem *list_head (struct list *@var{list}); +@deftypefunx struct list_elem *list_rend (struct list *@var{list}); +Returns the head sentinel of @var{list}. +@end deftypefun + +@deftypefun struct list_elem *list_tail (struct list *@var{list}); +@deftypefunx struct list_elem *list_end (struct list *@var{list}); +Returns the tail sentinel of @var{list}. +@end deftypefun + +@deftypefun struct list_elem *list_begin (struct list *@var{list}); +Returns the first element of @var{list}, or the tail sentinel if the list is empty. +@end deftypefun + +@deftypefun struct list_elem *list_rbegin (struct list *@var{list}); +Returns the last element of @var{list}, or the head sentinel if the list is empty. +@end deftypefun + +@deftypefun struct list_elem *list_front (struct list *@var{list}); +Returns the front element in @var{list}. +Undefined behaviour if @var{list} is empty. +@end deftypefun + +@deftypefun struct list_elem *list_back (struct list *@var{list}); +Returns the last element in @var{list}. +Undefined behaviour if @var{list} is empty. +@end deftypefun + +@deftypefun struct list_elem *list_next (struct list_elem *@var{elem}); +Returns the element after @var{elem} in its list. +If @var{elem} is the last element in its list, returns the list tail sentinel. +Results are undefined if @var{elem} is itself a list tail sentinel. +@end deftypefun + +@deftypefun struct list_elem *list_prev (struct list_elem *@var{elem}); +Returns the element before @var{elem} in its list. +If @var{elem} is the first element in its list, returns the list head sentinel. +Results are undefined if @var{elem} is itself a list head sentinel. +@end deftypefun + +@node List Insertion Functions +@subsection Insertion Functions + +Each of these functions allows for the insertion of an element into a linked list. + +@deftypefun void list_push_front (struct list *@var{list}, struct list_elem *@var{elem}); +Inserts @var{elem} at the beginning of @var{list}, so that it becomes the first element in @var{list}. +@end deftypefun + +@deftypefun void list_push_back (struct list *@var{list}, struct list_elem *@var{elem}); +Inserts @var{elem} at the end of @var{list}, so that it becomes the last element in @var{list}. +@end deftypefun + +@deftypefun void list_insert (struct list_elem *@var{before}, struct list_elem *@var{elem}); +Inserts @var{elem} just before @var{before}, which may be either an interior element or a tail sentinel of a list. +The latter case is equivalent to @code{list_push_back}. +Undefined behaviour if @var{elem} is already in the list. +@end deftypefun + +@deftypefun void list_splice (struct list_elem *@var{before}, struct list_elem *@var{first}, struct list_elem *@var{last}); +Removes elements @var{first} though @var{last} (exclusive) from their current list, +then inserts them just before @var{before}, which may be either an interior element or a tail sentinel. +@end deftypefun + +@node List Removal Functions +@subsection Removal Functions + +Each of these functions allows for the removal of an element from a linked list. + +@deftypefun struct list_elem *list_remove (struct list_elem *@var{elem}); +Removes @var{elem} from its list and returns the element that followed it. +Undefined behaviour if @var{elem} is not in a list. +@end deftypefun + +@deftypefun struct list_elem *list_pop_front (struct list *@var{list}); +Removes the first element from @var{list} and returns it. +Undefined behaviour if @var{list} is empty. +@end deftypefun + +@deftypefun struct list_elem *list_pop_back (struct list *@var{list}); +Removes the last element from @var{list} and returns it. +Undefined behaviour if @var{list} is empty. +@end deftypefun + +A list element must be treated very carefully after removing it from its list. +Calling @code{list_next(elem)} or @code{list_prev(elem)} will return the item that was previously before or after @var{elem}, +but, @code{list_prev(list_next(elem))} is no longer @var{elem}! + +@node Ordered List Operations +@subsection Ordered List Operations + +The PintOS list implementation includes some functions specifically designed for working with ordered lists. +Each of these functions relies on the definition of an ordering function. + +@deftypefun typedef bool list_less_func (const struct list_elem *@var{a}, const struct list_elem *@var{b}, void *@var{aux}); +Compares the value of two list elements @var{a} and @var{b}, given auxiliary data @var{aux}. +Returns true if @var{a} is less than @var{b}, or false if @var{a} is greater than or equal to @var{b}. +@end deftypefun + +@xref{List Auxiliary Data}, for an explanation of @var{aux}. + +A list can then be sorted into an ordered list. + +@deftypefun void list_sort (struct list *@var{list}, list_less_func *@var{less}, void *@var{aux}); +Sorts @var{list} according to @var{less} given auxiliary data @var{aux}. +@end deftypefun + +Each of these functions allow operations over an ordered list. + +@deftypefun void list_insert_ordered (struct list *@var{list}, struct list_elem *@var{elem}, list_less_func *@var{less}, void *@var{aux}); +Inserts @var{elem} in the proper position in @var{list}, which must be sorted according to @var{less} given auxiliary data @var{aux}. +@end deftypefun + +@deftypefun void list_unique (struct list *@var{list}, struct list *@var{duplicates}, list_less_func *@var{less}, void *@var{aux}); +Iterates through @var{list} and removes all but the first in each set of adjacent elements that are equal according to @var{less} given auxiliary data @var{aux}. +If @var{duplicates} is non-null, then the elements from @var{list} are appended to @var{duplicates}. +@end deftypefun + +@deftypefun struct list_elem *list_max (struct list *@var{list}, list_less_func *@var{less}, void *@var{aux}); +Returns the element in @var{list} with the largest value according to @var{less} given auxiliary data @var{aux}. +If there is more than one maximum, returns the one that appears earlier in the list. +If the list is empty, returns its tail sentinel. +@end deftypefun + +@deftypefun struct list_elem *list_min (struct list *@var{list}, list_less_func *@var{less}, void *@var{aux}); +Returns the element in @var{list} with the smallest value according to @var{less} given auxiliary data @var{aux}. +If there is more than one minimum, returns the one that appears earlier in the list. +If the list is empty, returns its tail sentinel. +@end deftypefun + +@node List Example +@subsection List Example + +Suppose there is a need for a list of @code{struct foo}. +First define @code{struct foo} to include a @code{struct list_elem} member: + +@example +struct foo + @{ + struct list_elem elem; + int bar; + ...other members... + @}; +@end example + +Then a list of @code{struct foo} can be be declared and initialised like this: + +@example +struct list foo_list; + +list_init (&foo_list); +@end example + +Now we can add, traverse and remove items form the list as desired. + +Iteration is a typical situation where it is necessary to convert from a @code{struct list_elem} back to its enclosing structure. +Here's an example using our @code{foo_list}: + +@example +struct list_elem *e; + +for (e = list_begin (&foo_list); e != list_end (&foo_list); + e = list_next (e)) + @{ + struct foo *f = list_entry (e, struct foo, elem); + ...do something with f... + @} +@end example + +If we wanted to order our @code{foo_list} in terms of each element's @code{bar} member, then we would need to define a @code{list_less_func} as follows: + +@example +static bool sort_foos_by_bar(const struct list_elem *a_, + const struct list_elem *b_, + void *aux UNUSED) + @{ + const struct foo *a = list_entry (a_, struct foo, elem); + const struct foo *b = list_entry (b_, struct foo, elem); + + return a->bar < b->bar; + @} +@end example + +We can then order the list by calling: + +@example +list_sort(foo_list, sort_foos_by_bar, NULL) +@end example + +@node List Auxiliary Data +@subsection Auxiliary Data + +In simple cases like the example above, there's no need for the @var{aux} parameters for the ordered list operations. +In these cases, just pass a null pointer to the fuctions for @var{aux} +(You'll get a compiler warning if you don't use the @var{aux} parameter, +but you can turn that off with the @code{UNUSED} macro, as shown in the example, or you can just ignore it.) + +@var{aux} is useful when you have some property of the elements in the list that is both constant and needed for element comparisons, +but not stord in the elements themselves. +For example, if the elements in a list are fixed-length strings, +but the elements themselves don't indicate what that fixed length is, +you could pass the length as an @var{aux} parameter. + +@node List Synchronisation +@subsection Synchronisation + +The linked list does not do any internal synchronization. It is the caller's responsibility to synchronize calls to list functions. +In general, any number of functions that examine but do not modify the list, such as @func{list_size} or @func{list_next}, may execute simultaneously. +However, these functions cannot safely execute at the same time as any function that may modify a given list, +such as @func{list_insert} or @func{list_remove}, nor may more than one function that can modify a given list execute safely at once. + +It is also the caller's responsibility to synchronize access to data in list elements. +How to synchronize access to this data depends on how it is designed and organized, as with any other data structure. + +@node Hash Table +@section Hash Table + +PintOS provides a hash table data structure in @file{lib/kernel/hash.c}. +To use it you will need to include its header file, +@file{lib/kernel/hash.h}, with @code{#include <hash.h>}. +No code provided with PintOS uses the hash table, which means that you +are free to use it as is, modify its implementation for your own +purposes, or ignore it, as you wish. + +Most implementations of the virtual memory task use a hash table to +translate pages to frames. You may find other uses for hash tables as +well. + +@menu +* Hash Data Types:: +* Basic Hash Functions:: +* Hash Search Functions:: +* Hash Iteration Functions:: +* Hash Table Example:: +* Hash Auxiliary Data:: +* Hash Synchronization:: +@end menu + +@node Hash Data Types +@subsection Data Types + +A hash table is represented by @struct{hash}. + +@deftp {Type} {struct hash} +Represents an entire hash table. The actual members of @struct{hash} +are ``opaque.'' That is, code that uses a hash table should not access +@struct{hash} members directly, nor should it need to. Instead, use +hash table functions and macros. +@end deftp + +The hash table operates on elements of type @struct{hash_elem}. + +@deftp {Type} {struct hash_elem} +Embed a @struct{hash_elem} member in the structure you want to include +in a hash table. Like @struct{hash}, @struct{hash_elem} is opaque. +All functions for operating on hash table elements actually take and +return pointers to @struct{hash_elem}, not pointers to your hash table's +real element type. +@end deftp + +You will often need to obtain a @struct{hash_elem} given a real element +of the hash table, and vice versa. Given a real element of the hash +table, you may use the @samp{&} operator to obtain a pointer to its +@struct{hash_elem}. Use the @code{hash_entry()} macro to go the other +direction. + +@deftypefn {Macro} {@var{type} *} hash_entry (struct hash_elem *@var{elem}, @var{type}, @var{member}) +Returns a pointer to the structure that @var{elem}, a pointer to a +@struct{hash_elem}, is embedded within. You must provide @var{type}, +the name of the structure that @var{elem} is inside, and @var{member}, +the name of the member in @var{type} that @var{elem} points to. + +For example, suppose @code{h} is a @code{struct hash_elem *} variable +that points to a @struct{thread} member (of type @struct{hash_elem}) +named @code{h_elem}. Then, @code{hash_entry@tie{}(h, struct thread, h_elem)} +yields the address of the @struct{thread} that @code{h} points within. +@end deftypefn + +@xref{Hash Table Example}, for an example. + +Each hash table element must contain a key, that is, data that +identifies and distinguishes elements, which must be unique +among elements in the hash table. (Elements may +also contain non-key data that need not be unique.) While an element is +in a hash table, its key data must not be changed. Instead, if need be, +remove the element from the hash table, modify its key, then reinsert +the element. + +For each hash table, you must write two functions that act on keys: a +hash function and a comparison function. These functions must match the +following prototypes: + +@deftp {Type} {unsigned hash_hash_func (const struct hash_elem *@var{element}, void *@var{aux})} +Returns a hash of @var{element}'s data, as a value anywhere in the range +of @code{unsigned int}. The hash of an element should be a +pseudo-random function of the element's key. It must not depend on +non-key data in the element or on any non-constant data other than the +key. PintOS provides the following functions as a suitable basis for +hash functions. + +@deftypefun unsigned hash_bytes (const void *@var{buf}, size_t *@var{size}) +Returns a hash of the @var{size} bytes starting at @var{buf}. The +implementation is the general-purpose +@uref{http://en.wikipedia.org/wiki/Fowler_Noll_Vo_hash, Fowler-Noll-Vo +hash} for 32-bit words. +@end deftypefun + +@deftypefun unsigned hash_string (const char *@var{s}) +Returns a hash of null-terminated string @var{s}. +@end deftypefun + +@deftypefun unsigned hash_int (int @var{i}) +Returns a hash of integer @var{i}. +@end deftypefun + +If your key is a single piece of data of an appropriate type, it is +sensible for your hash function to directly return the output of one of +these functions. For multiple pieces of data, you may wish to combine +the output of more than one call to them using, e.g., the @samp{^} +(exclusive or) +operator. Finally, you may entirely ignore these functions and write +your own hash function from scratch, but remember that your goal is to +build an operating system kernel, not to design a hash function. + +@xref{Hash Auxiliary Data}, for an explanation of @var{aux}. +@end deftp + +@deftp {Type} {bool hash_less_func (const struct hash_elem *@var{a}, const struct hash_elem *@var{b}, void *@var{aux})} +Compares the keys stored in elements @var{a} and @var{b}. Returns +true if @var{a} is less than @var{b}, false if @var{a} is greater than +or equal to @var{b}. + +If two elements compare equal, then they must hash to equal values. + +@xref{Hash Auxiliary Data}, for an explanation of @var{aux}. +@end deftp + +@xref{Hash Table Example}, for hash and comparison function examples. + +A few functions accept a pointer to a third kind of +function as an argument: + +@deftp {Type} {void hash_action_func (struct hash_elem *@var{element}, void *@var{aux})} +Performs some kind of action, chosen by the caller, on @var{element}. + +@xref{Hash Auxiliary Data}, for an explanation of @var{aux}. +@end deftp + +@node Basic Hash Functions +@subsection Basic Functions + +These functions create, destroy, and inspect hash tables. + +@deftypefun bool hash_init (struct hash *@var{hash}, hash_hash_func *@var{hash_func}, hash_less_func *@var{less_func}, void *@var{aux}) +Initializes @var{hash} as a hash table with @var{hash_func} as hash +function, @var{less_func} as comparison function, and @var{aux} as +auxiliary data. +Returns true if successful, false on failure. @func{hash_init} calls +@func{malloc} and fails if memory cannot be allocated. + +@xref{Hash Auxiliary Data}, for an explanation of @var{aux}, which is +most often a null pointer. +@end deftypefun + +@deftypefun void hash_clear (struct hash *@var{hash}, hash_action_func *@var{action}) +Removes all the elements from @var{hash}, which must have been +previously initialized with @func{hash_init}. + +If @var{action} is non-null, then it is called once for each element in +the hash table, which gives the caller an opportunity to deallocate any +memory or other resources used by the element. For example, if the hash +table elements are dynamically allocated using @func{malloc}, then +@var{action} could @func{free} the element. This is safe because +@func{hash_clear} will not access the memory in a given hash element +after calling @var{action} on it. However, @var{action} must not call +any function that may modify the hash table, such as @func{hash_insert} +or @func{hash_delete}. +@end deftypefun + +@deftypefun void hash_destroy (struct hash *@var{hash}, hash_action_func *@var{action}) +If @var{action} is non-null, calls it for each element in the hash, with +the same semantics as a call to @func{hash_clear}. Then, frees the +memory held by @var{hash}. Afterward, @var{hash} must not be passed to +any hash table function, absent an intervening call to @func{hash_init}. +@end deftypefun + +@deftypefun size_t hash_size (struct hash *@var{hash}) +Returns the number of elements currently stored in @var{hash}. +@end deftypefun + +@deftypefun bool hash_empty (struct hash *@var{hash}) +Returns true if @var{hash} currently contains no elements, +false if @var{hash} contains at least one element. +@end deftypefun + +@node Hash Search Functions +@subsection Search Functions + +Each of these functions searches a hash table for an element that +compares equal to one provided. Based on the success of the search, +they perform some action, such as inserting a new element into the hash +table, or simply return the result of the search. + +@deftypefun {struct hash_elem *} hash_insert (struct hash *@var{hash}, struct hash_elem *@var{element}) +Searches @var{hash} for an element equal to @var{element}. If none is +found, inserts @var{element} into @var{hash} and returns a null pointer. +If the table already contains an element equal to @var{element}, it is +returned without modifying @var{hash}. +@end deftypefun + +@deftypefun {struct hash_elem *} hash_replace (struct hash *@var{hash}, struct hash_elem *@var{element}) +Inserts @var{element} into @var{hash}. Any element equal to +@var{element} already in @var{hash} is removed. Returns the element +removed, or a null pointer if @var{hash} did not contain an element +equal to @var{element}. + +The caller is responsible for deallocating any resources associated with +the returned element, as appropriate. For example, if the hash table +elements are dynamically allocated using @func{malloc}, then the caller +must @func{free} the element after it is no longer needed. +@end deftypefun + +The element passed to the following functions is only used for hashing +and comparison purposes. It is never actually inserted into the hash +table. Thus, only key data in the element needs to be initialized, and +other data in the element will not be used. It often makes sense to +declare an instance of the element type as a local variable, initialize +the key data, and then pass the address of its @struct{hash_elem} to +@func{hash_find} or @func{hash_delete}. @xref{Hash Table Example}, for +an example. (Large structures should not be +allocated as local variables. @xref{struct thread}, for more +information.) + +@deftypefun {struct hash_elem *} hash_find (struct hash *@var{hash}, struct hash_elem *@var{element}) +Searches @var{hash} for an element equal to @var{element}. Returns the +element found, if any, or a null pointer otherwise. +@end deftypefun + +@deftypefun {struct hash_elem *} hash_delete (struct hash *@var{hash}, struct hash_elem *@var{element}) +Searches @var{hash} for an element equal to @var{element}. If one is +found, it is removed from @var{hash} and returned. Otherwise, a null +pointer is returned and @var{hash} is unchanged. + +The caller is responsible for deallocating any resources associated with +the returned element, as appropriate. For example, if the hash table +elements are dynamically allocated using @func{malloc}, then the caller +must @func{free} the element after it is no longer needed. +@end deftypefun + +@node Hash Iteration Functions +@subsection Iteration Functions + +These functions allow iterating through the elements in a hash table. +Two interfaces are supplied. The first requires writing and supplying a +@var{hash_action_func} to act on each element (@pxref{Hash Data Types}). + +@deftypefun void hash_apply (struct hash *@var{hash}, hash_action_func *@var{action}) +Calls @var{action} once for each element in @var{hash}, in arbitrary +order. @var{action} must not call any function that may modify the hash +table, such as @func{hash_insert} or @func{hash_delete}. @var{action} +must not modify key data in elements, although it may modify any other +data. +@end deftypefun + +The second interface is based on an ``iterator'' data type. +Idiomatically, iterators look like: + +@example +struct hash_iterator i; + +hash_first (&i, h); +while (hash_next (&i)) + @{ + struct foo *f = hash_entry (hash_cur (&i), struct foo, elem); + @r{@dots{}do something with @i{f}@dots{}} + @} +@end example + +@deftp {Type} {struct hash_iterator} +Represents a position within a hash table. Calling any function that +may modify a hash table, such as @func{hash_insert} or +@func{hash_delete}, invalidates all iterators within that hash table. + +Like @struct{hash} and @struct{hash_elem}, @struct{hash_elem} is opaque. +@end deftp + +@deftypefun void hash_first (struct hash_iterator *@var{iterator}, struct hash *@var{hash}) +Initializes @var{iterator} to just before the first element in +@var{hash}. +@end deftypefun + +@deftypefun {struct hash_elem *} hash_next (struct hash_iterator *@var{iterator}) +Advances @var{iterator} to the next element in @var{hash}, and returns +that element. Returns a null pointer if no elements remain. After +@func{hash_next} returns null for @var{iterator}, calling it again +yields undefined behaviour. +@end deftypefun + +@deftypefun {struct hash_elem *} hash_cur (struct hash_iterator *@var{iterator}) +Returns the value most recently returned by @func{hash_next} for +@var{iterator}. Yields undefined behaviour after @func{hash_first} has +been called on @var{iterator} but before @func{hash_next} has been +called for the first time. +@end deftypefun + +@node Hash Table Example +@subsection Hash Table Example + +Suppose you have a structure, called @struct{page}, that you +want to put into a hash table. First, define @struct{page} to include a +@struct{hash_elem} member: + +@example +struct page + @{ + struct hash_elem hash_elem; /* @r{Hash table element.} */ + void *addr; /* @r{Virtual address.} */ + /* @r{@dots{}other members@dots{}} */ + @}; +@end example + +We write a hash function and a comparison function using @var{addr} as +the key. A pointer can be hashed based on its bytes, and the @samp{<} +operator works fine for comparing pointers: + +@example +/* @r{Returns a hash value for page @var{p}.} */ +unsigned +page_hash (const struct hash_elem *p_, void *aux UNUSED) +@{ + const struct page *p = hash_entry (p_, struct page, hash_elem); + return hash_bytes (&p->addr, sizeof p->addr); +@} + +/* @r{Returns true if page @var{a} precedes page @var{b}.} */ +bool +page_less (const struct hash_elem *a_, const struct hash_elem *b_, + void *aux UNUSED) +@{ + const struct page *a = hash_entry (a_, struct page, hash_elem); + const struct page *b = hash_entry (b_, struct page, hash_elem); + + return a->addr < b->addr; +@} +@end example + +@noindent +(The use of @code{UNUSED} in these functions' prototypes suppresses a +warning that @var{aux} is unused. @xref{Function and Parameter +Attributes}, for information about @code{UNUSED}. @xref{Hash Auxiliary +Data}, for an explanation of @var{aux}.) + +@page +Then, we can create a hash table like this: + +@example +struct hash pages; + +hash_init (&pages, page_hash, page_less, NULL); +@end example + +Now we can manipulate the hash table we've created. If @code{@var{p}} +is a pointer to a @struct{page}, we can insert it into the hash table +with: + +@example +hash_insert (&pages, &p->hash_elem); +@end example + +@noindent If there's a chance that @var{pages} might already contain a +page with the same @var{addr}, then we should check @func{hash_insert}'s +return value. + +To search for an element in the hash table, use @func{hash_find}. This +takes a little setup, because @func{hash_find} takes an element to +compare against. Here's a function that will find and return a page +based on a virtual address, assuming that @var{pages} is defined at file +scope: + +@example +/* @r{Returns the page containing the given virtual @var{address},} + @r{or a null pointer if no such page exists.} */ +struct page * +page_lookup (const void *address) +@{ + struct page p; + struct hash_elem *e; + + p.addr = address; + e = hash_find (&pages, &p.hash_elem); + return e != NULL ? hash_entry (e, struct page, hash_elem) : NULL; +@} +@end example + +@noindent +@struct{page} is allocated as a local variable here on the assumption +that it is fairly small. Large structures should not be allocated as +local variables. @xref{struct thread}, for more information. + +A similar function could delete a page by address using +@func{hash_delete}. + +@node Hash Auxiliary Data +@subsection Auxiliary Data + +In simple cases like the example above, there's no need for the +@var{aux} parameters. In these cases, just pass a null pointer to +@func{hash_init} for @var{aux} and ignore the values passed to the hash +function and comparison functions. (You'll get a compiler warning if +you don't use the @var{aux} parameter, but you can turn that off with +the @code{UNUSED} macro, as shown in the example, or you can just ignore +it.) + +@var{aux} is useful when you have some property of the data in the +hash table is both constant and needed for hashing or comparison, +but not stored in the data items themselves. For example, if +the items in a hash table are fixed-length strings, but the items +themselves don't indicate what that fixed length is, you could pass +the length as an @var{aux} parameter. + +@node Hash Synchronization +@subsection Synchronization + +The hash table does not do any internal synchronization. It is the +caller's responsibility to synchronize calls to hash table functions. +In general, any number of functions that examine but do not modify the +hash table, such as @func{hash_find} or @func{hash_next}, may execute +simultaneously. However, these function cannot safely execute at the +same time as any function that may modify a given hash table, such as +@func{hash_insert} or @func{hash_delete}, nor may more than one function +that can modify a given hash table execute safely at once. + +It is also the caller's responsibility to synchronize access to data in +hash table elements. How to synchronize access to this data depends on +how it is designed and organized, as with any other data structure. + diff --git a/doc/sample.tmpl b/doc/sample.tmpl new file mode 100644 index 0000000..5f1ba87 --- /dev/null +++ b/doc/sample.tmpl @@ -0,0 +1,104 @@ + + +-----------------+ + | CS 140 | + | SAMPLE TASK | + | DESIGN DOCUMENT | + +-----------------+ + +---- GROUP ---- + +Ben Pfaff <blp@stanford.edu> + +---- PRELIMINARIES ---- + +>> If you have any preliminary comments on your submission, notes for +>> the TAs, or extra credit, please give them here. + +(This is a sample design document.) + +>> Please cite any offline or online sources you consulted while +>> preparing your submission, other than the PintOS documentation, +>> course text, and lecture notes. + +None. + + JOIN + ==== + +---- DATA STRUCTURES ---- + +>> Copy here the declaration of each new or changed `struct' or `struct' +>> member, global or static variable, `typedef', or enumeration. +>> Identify the purpose of each in 25 words or less. + +A "latch" is a new synchronization primitive. Acquires block +until the first release. Afterward, all ongoing and future +acquires pass immediately. + + /* Latch. */ + struct latch + { + bool released; /* Released yet? */ + struct lock monitor_lock; /* Monitor lock. */ + struct condition rel_cond; /* Signaled when released. */ + }; + +Added to struct thread: + + /* Members for implementing thread_join(). */ + struct latch ready_to_die; /* Release when thread about to die. */ + struct semaphore can_die; /* Up when thread allowed to die. */ + struct list children; /* List of child threads. */ + list_elem children_elem; /* Element of `children' list. */ + +---- ALGORITHMS ---- + +>> Briefly describe your implementation of thread_join() and how it +>> interacts with thread termination. + +thread_join() finds the joined child on the thread's list of +children and waits for the child to exit by acquiring the child's +ready_to_die latch. When thread_exit() is called, the thread +releases its ready_to_die latch, allowing the parent to continue. + +---- SYNCHRONIZATION ---- + +>> Consider parent thread P with child thread C. How do you ensure +>> proper synchronization and avoid race conditions when P calls wait(C) +>> before C exits? After C exits? How do you ensure that all resources +>> are freed in each case? How about when P terminates without waiting, +>> before C exits? After C exits? Are there any special cases? + +C waits in thread_exit() for P to die before it finishes its own +exit, using the can_die semaphore "down"ed by C and "up"ed by P as +it exits. Regardless of whether whether C has terminated, there +is no race on wait(C), because C waits for P's permission before +it frees itself. + +Regardless of whether P waits for C, P still "up"s C's can_die +semaphore when P dies, so C will always be freed. (However, +freeing C's resources is delayed until P's death.) + +The initial thread is a special case because it has no parent to +wait for it or to "up" its can_die semaphore. Therefore, its +can_die semaphore is initialized to 1. + +---- RATIONALE ---- + +>> Critique your design, pointing out advantages and disadvantages in +>> your design choices. + +This design has the advantage of simplicity. Encapsulating most +of the synchronization logic into a new "latch" structure +abstracts what little complexity there is into a separate layer, +making the design easier to reason about. Also, all the new data +members are in `struct thread', with no need for any extra dynamic +allocation, etc., that would require extra management code. + +On the other hand, this design is wasteful in that a child thread +cannot free itself before its parent has terminated. A parent +thread that creates a large number of short-lived child threads +could unnecessarily exhaust kernel memory. This is probably +acceptable for implementing kernel threads, but it may be a bad +idea for use with user processes because of the larger number of +resources that user processes tend to own. diff --git a/doc/standards.texi b/doc/standards.texi new file mode 100644 index 0000000..df908e1 --- /dev/null +++ b/doc/standards.texi @@ -0,0 +1,195 @@ +@node Coding Standards +@appendix Coding Standards + +All of you should be familiar with good coding standards by now. +This project will be much easier to complete and grade if you maintain a consistent code style and employ sensible variable naming policies. +Code style makes up a significant part of your final grade for this work, and will be scrutinised carefully. + +We want to stress that aside from the fact that we are explicitly basing part of your grade on this, +good coding practices will also improve the quality of your code. +This makes it easier for your team-mates to interact with it and, ultimately, will improve your chances of having a good working program. + +The rest of this appendix will discuss the coding standards used in the existing PintOS codebase and how we expect you to interact with this. + +@menu +* Coding Style:: +* C99:: +* Unsafe String Functions:: +@end menu + +@comment ---------------------------------------------------------------------- + +@node Coding Style +@section Style + +Style, for the purposes of our grading, refers to how readable your +code is. At minimum, this means that your code is well formatted, your +variable names are descriptive and your functions are decomposed and +well commented. Any other factors which make it hard (or easy) for us +to read or use your code will be reflected in your style grade. + +The existing PintOS code is written in the GNU style and largely +follows the @uref{http://www.gnu.org/prep/standards_toc.html, , GNU +Coding Standards}. We encourage you to follow the applicable parts of +them too, especially chapter 5, ``Making the Best Use of C.'' Using a +different style won't cause actual problems so long as you are self-consistent in your additions. +It is ugly to see gratuitous differences in style from one function to another. +If your code is too ugly, it will cost you points. + +Please limit C source file lines to at most 80 characters long. + +PintOS comments sometimes refer to external standards or +specifications by writing a name inside square brackets, like this: +@code{[IA32-v3a]}. These names refer to the reference names used in +this documentation (@pxref{Bibliography}). + +If you remove existing PintOS code, please delete it from your source +file entirely. Don't just put it into a comment or a conditional +compilation directive, because that makes the resulting code hard to +read. Version control software will allow you to recover the code if +necessary later. + +We're only going to do a compile in the directory for the task being +submitted. You don't need to make sure that the previous tasks also +compile. + +Task code should be written so that all of the subproblems for the +task function together, that is, without the need to rebuild with +different macros defined, etc. +If you decide to do any work beyond the spec that +changes normal PintOS behaviour so as to interfere with grading, then +you must implement it so that it only acts that way when given a +special command-line option of the form @option{-@var{name}}, where +@var{name} is a name of your choice. You can add such an option by +modifying @func{parse_options} in @file{threads/init.c}. + +The introduction section (@pxref{Source Code}) describes some additional high-level coding style requirements. + +@comment ---------------------------------------------------------------------- + +@page +@node C99 +@section C99 + +The PintOS source code uses a few features of the ``C99'' standard +library that were not in the original 1989 standard for C. +Many programmers are unaware of these features, so we will describe them. +The new features used in PintOS are mostly in new headers: + +@table @file +@item <stdbool.h> +Defines macros @code{bool}, a 1-bit type that takes on only the values +0 and 1, @code{true}, which expands to 1, and @code{false}, which +expands to 0. + +@item <stdint.h> +On systems that support them, this header defines types +@code{int@var{n}_t} and @code{uint@var{n}_t} for @var{n} = 8, 16, 32, +64, and possibly other values. These are 2's complement signed and unsigned +types, respectively, with the given number of bits. + +On systems where it is possible, this header also defines types +@code{intptr_t} and @code{uintptr_t}, which are integer types big +enough to hold a pointer. + +On all systems, this header defines types @code{intmax_t} and +@code{uintmax_t}, which are the system's signed and unsigned integer +types with the widest ranges. + +For every signed integer type @code{@var{type}_t} defined here, as well +as for @code{ptrdiff_t} defined in @file{<stddef.h>}, this header also +defines macros @code{@var{TYPE}_MAX} and @code{@var{TYPE}_MIN} that +give the type's range. Similarly, for every unsigned integer type +@code{@var{type}_t} defined here, as well as for @code{size_t} defined +in @file{<stddef.h>}, this header defines a @code{@var{TYPE}_MAX} +macro giving its maximum value. + +@item <inttypes.h> +@file{<stdint.h>} provides no straightforward way to format +the types it defines with @func{printf} and related functions. This +header provides macros to help with that. For every +@code{int@var{n}_t} defined by @file{<stdint.h>}, it provides macros +@code{PRId@var{n}} and @code{PRIi@var{n}} for formatting values of +that type with @code{"%d"} and @code{"%i"}. Similarly, for every +@code{uint@var{n}_t}, it provides @code{PRIo@var{n}}, +@code{PRIu@var{n}}, @code{PRIx@var{n}}, and @code{PRIX@var{n}}. + +You use these something like this, taking advantage of the fact that +the C compiler concatenates adjacent string literals: +@example +#include <inttypes.h> +@dots{} +int32_t value = @dots{}; +printf ("value=%08"PRId32"\n", value); +@end example +@noindent +(note that the @code{%08} format string above pads the output int to 8 significant figures). +The @samp{%} is not supplied by the @code{PRI} macros. +As shown above, you supply it yourself and follow it by any flags, field width, etc. + +@item <stdio.h> +The @func{printf} function has some new type modifiers for printing +standard types: + +@table @samp +@item j +For @code{intmax_t} (e.g.@: @samp{%jd}) or @code{uintmax_t} (e.g.@: +@samp{%ju}). + +@item z +For @code{size_t} (e.g.@: @samp{%zu}). + +@item t +For @code{ptrdiff_t} (e.g.@: @samp{%td}). +@end table + +PintOS @func{printf} also implements a nonstandard @samp{'} flag that +groups large numbers with commas to make them easier to read. +@end table + +@comment ----------------------------------------------------------------------@page + +@node Unsafe String Functions +@section Unsafe String Functions + +A few of the string functions declared in the standard +@file{<string.h>} and @file{<stdio.h>} headers are notoriously unsafe. +The worst offenders are intentionally not included in the PintOS C +library: + +@table @code +@item strcpy() +When used carelessly this function can overflow the buffer reserved +for its output string. Use @func{strlcpy} instead. Refer to +comments in its source code in @code{lib/string.c} for documentation. + +@item strncpy() +This function can leave its destination buffer without a null string +terminator. It also has performance problems. Again, use +@func{strlcpy}. + +@item strcat() +Same issue as @func{strcpy}. Use @func{strlcat} instead. +Again, refer to comments in its source code in @code{lib/string.c} for +documentation. + +@item strncat() +The meaning of its buffer size argument is surprising. +Again, use @func{strlcat}. + +@item strtok() +Uses global data, so it is unsafe in threaded programs such as +kernels. Use @func{strtok_r} instead, and see its source code in +@code{lib/string.c} for documentation and an example. + +@item sprintf() +Same issue as @func{strcpy}. Use @func{snprintf} instead. Refer +to comments in @code{lib/stdio.h} for documentation. + +@item vsprintf() +Same issue as @func{strcpy}. Use @func{vsnprintf} instead. +@end table + +If you try to use any of these functions, the error message will give +you a hint by referring to an identifier like +@code{dont_use_sprintf_use_snprintf}. diff --git a/doc/task0_questions.texi b/doc/task0_questions.texi new file mode 100644 index 0000000..5cad347 --- /dev/null +++ b/doc/task0_questions.texi @@ -0,0 +1,84 @@ +@strong{Part A - Codebase Preview: Questions to Prepare for the MCQ AnswerBook Test} + +@enumerate + +@item Which Git command should you run to retrieve a copy of your individual repository for PintOS Task 0 in your local directory? +(@dfn{Hint: be specific to this task and think about ease of use.}) + +@item Why is using the strcpy() function to copy strings usually a bad idea? +(@dfn{Hint: be sure to clearly identify the problem.}) + +@item If test @file{src/tests/devices/alarm-multiple} fails, where would you find its output and result logs? Provide both paths and file names. +(@dfn{Hint: you might want to run this test to find out.}) + +@item In PintOS, a thread is characterized by a struct and an execution stack. + +(a) What are the limitations on the size of these data structures? + +(b) Explain how this relates to stack overflow and how PintOS identifies it. + +@item Explain how thread scheduling in PintOS currently works in roughly 300 words. Include the chain of execution of function calls. +(@dfn{Hint: we expect you to at least mention which functions participate in a context switch, how they interact, how and when the thread state is modified and the role of interrupts.}) + + +@item In PintOS, what is the default length (in ticks and in seconds) of a scheduler time slice? +(@dfn{Hint: read the Task 0 documentation carefully.}) + +@item In PintOS, how would you print an unsigned 64 bit @code{int}? +(Consider that you are working with C99). Don't forget to state any inclusions needed by your code. + +@item Explain the property of @strong{reproducibility} and how the lack of reproducibility will affect debugging. + +@item In PintOS, locks are implemented on top of semaphores. + +(a) How do the functions in the API of locks relate to those of semaphores? + +(b) What extra property do locks have that semaphores do not? + +@item Define what is meant by a @strong{race-condition}. Why is the test @code{if(x != null)} insufficient to prevent a segmentation fault from occurring on an attempted access to a structure through the pointer @code{x}? +(@dfn{Hint: you should assume that the pointer variable is correctly typed, that the structure was successfully initialised earlier in the program and that there are other threads running in parallel.}) + +@end enumerate + +@strong{Part B - The Alarm Clock} + +Reimplement @code{timer_sleep()}, defined in @file{devices/timer.c}. +(@b{30 marks}) + +Although a working implementation of @code{timer_sleep} is provided, it "busy waits", that is, it spins in a loop checking the current time and calling @code{thread_yield()} until enough time has gone by. +You need to reimplement it to avoid busy waiting. +Further instructions and hints can be found in the PintOS manual. + +The marks for this question are awarded as follows: + +Passing the Automated Tests (@b{8 marks}). + +Performance in the Code Review (@b{12 marks}). + +Answering the Design Document Questions below (@b{10 marks}). + +@itemize @w{} +@item @b{Data Structures} + +A1: Copy here the declaration of each new or changed `@code{struct}' or `@code{struct}' member, global or static variable, `@code{typedef}', or enumeration. Identify the purpose of each in roughly 25 words. (@b{2 marks}) + +@item @b{Algorithms} + +A2: Briefly describe what happens in a call to @code{timer_sleep()}, including the actions performed by the timer interrupt handler on each timer tick. (@b{2 marks}) + +A3: What steps are taken to minimize the amount of time spent in the timer interrupt handler? (@b{2 marks}) + +@item @b{Synchronization} + +A4: How are race conditions avoided when multiple threads call @code{timer_sleep()} simultaneously? (@b{1 mark}) + +A5: How are race conditions avoided when a timer interrupt occurs during a call to @code{timer_sleep()}? (@b{1 mark}) + +@item @b{Rationale} + +A6: Why did you choose this design? +In what ways is it superior to another design you considered? (@b{2 marks}) + +@end itemize + + diff --git a/doc/task0_sheet.texi b/doc/task0_sheet.texi new file mode 100644 index 0000000..7bb4d90 --- /dev/null +++ b/doc/task0_sheet.texi @@ -0,0 +1,11 @@ +\input texinfo @c -*- texinfo -*- + +@c %**start of header +@setfilename task0_sheet.info +@settitle PintOS Task 0 +@c %**end of header + +@chapter PintOS-IC Task 0 Questions +@include task0_questions.texi + +@bye diff --git a/doc/texi2html b/doc/texi2html new file mode 100755 index 0000000..68a5d40 --- /dev/null +++ b/doc/texi2html @@ -0,0 +1,6346 @@ +#! /usr/bin/env perl +'di '; +'ig 00 '; +#+############################################################################## +# +# texi2html: Program to transform Texinfo documents to HTML +# +# Copyright (C) 1999, 2000 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +#-############################################################################## + +# This requires perl version 5 or higher +require 5.0; + +# Perl pragma to restrict unsafe constructs +use strict; +# +# According to +# larry.jones@sdrc.com (Larry Jones) +# this pragma is not present in perl5.004_02: +# +# Perl pragma to control optional warnings +# use warnings; + +# Declarations +use vars qw( + $ADDRESS + $ANTI_ALIAS + $ANTI_ALIAS_TEXT + $ASCII_MODE + $AUTO_LINK + $AUTO_PREFIX + $BIBRE + $CHAPTEREND + $CHILDLINE + $Configure_failed + $DEBUG + $DEBUG_BIB + $DEBUG_DEF + $DEBUG_GLOSS + $DEBUG_HTML + $DEBUG_INDEX + $DEBUG_L2H + $DEBUG_TOC + $DEBUG_USER + $DESTDIR + $ERROR + $EXTERNAL_FILE + $EXTERNAL_IMAGES + $EXTERNAL_UP_LINK + $EXTERNAL_UP_TITLE + $FH + $FIGURE_SCALE_FACTOR + $FILERE + $HTML_VERSION + $IMAGES_ONLY + $INFO + $LINE_WIDTH + $LOCAL_ICONS + $LONG_TITLES + $MATH_SCALE_FACTOR + $MAX_LINK_DEPTH + $MAX_SPLIT_DEPTH + $NETSCAPE_HTML + $NODERE + $NODESRE + $NOLATEX + $NO_FOOTNODE + $NO_IMAGES + $NO_NAVIGATION + $NO_SIMPLE_MATH + $NO_SUBDIR + $PAPERSIZE + $PREFIX + $PROTECTTAG + $PS_IMAGES + $REUSE + $SCALABLE_FONTS + $SECTIONEND + $SHORTEXTN + $SHORT_INDEX + $SHOW_SECTION_NUMBERS + $SPLIT + $T2H_ADDRESS + $T2H_AFTER_ABOUT + $T2H_AFTER_BODY_OPEN + $T2H_AUTHORS + $T2H_BODYTEXT + $T2H_BUTTONS + $T2H_EXTRA_HEAD + $T2H_FAILURE_TEXT + $T2H_HAS_TOP_HEADING + $T2H_HOMEPAGE + $T2H_ICONS + $T2H_OBSOLETE_OPTIONS + $T2H_OVERVIEW + $T2H_PRE_BODY_CLOSE + $T2H_THIS_SECTION + $T2H_TOC + $T2H_TODAY + $T2H_TOP + $T2H_USAGE_TEXT + $T2H_USER + $TEXDEFS + $THISPROG + $THISVERSION + $TITLE + $TITLES_LANGUAGE + $TMP + $TOPEND + $VARRE + $VERBOSE + $WARN + $WORDS_IN_NAVIGATION_PANEL_TITLES + $WORDS_IN_PAGE + $about_body + $addr + $after + $before + $bib_num + $button + $call + $changed + $complex_format_map + $contents + $count + $counter + $curlevel + $d + $default_language + $deferred_ref + $doc_num + $docid + $docu + $docu_about + $docu_about_file + $docu_dir + $docu_doc + $docu_doc_file + $docu_ext + $docu_foot + $docu_foot_file + $docu_frame_file + $docu_name + $docu_rdir + $docu_stoc + $docu_stoc_file + $docu_toc + $docu_toc_file + $docu_toc_frame_file + $docu_top + $docu_top_file + $done + $dont_html + $dotbug + $elt + $end_of_para + $end_tag + $entry + $ext + $extensions + $failed + $fh_name + $file + $first_index_chapter + $first_line + $foot + $foot_num + $footid + $ftype + $full + $gloss_num + $h_content + $h_line + $has_top + $has_top_command + $hcontent + $html_element + $html_num + $i + $id + $idx_num + $in + $in_bibliography + $in_glossary + $in_html + $in_list + $in_pre + $in_table + $in_titlepage + $in_top + $index + $index_properties + $init_file + $int_file + $is_extra + $key + $keys + $l + $l2h_cache_file + $l2h_cached_count + $l2h_extract_error + $l2h_html_count + $l2h_html_file + $l2h_latex_closing + $l2h_latex_count + $l2h_latex_file + $l2h_latex_preample + $l2h_name + $l2h_prefix + $l2h_range_error + $l2h_to_latex_count + $l_l2h + $latex_file + $len + $letter + $level + $macros + $man + $match + $maximage + $next + $nn + $node + $node_next + $node_prev + $node_up + $nodes + $num + $old + $only_text + $options + $post + $pre + $prev_node + $previous + $progdir + $re + $reused + $root + $sec_num + $section + $string + $style + $sub + $subst_code + $table_type + $tag + $texi_style + $to_do + $toc_indent + $tocid + $toplevel + $type + $url + $use_acc + $use_bibliography + $what + %T2H_ACTIVE_ICONS + %T2H_BUTTONS_EXAMPLE + %T2H_BUTTONS_GOTO + %T2H_HREF + %T2H_NAME + %T2H_NAVIGATION_TEXT + %T2H_NODE + %T2H_PASSIVE_ICONS + %T2H_THISDOC + %accent_map + %bib2href + %context + %def_map + %format_map + %gloss2href + %idx2node + %l2h_cache + %l2h_img + %l2h_to_latex + %macros + %node2href + %node2next + %node2prev + %node2sec + %node2up + %number2sec + %predefined_index + %sec2level + %sec2node + %sec2seccount + %seccount2sec + %sec2number + %seen + %simple_map + %style_map + %tag2pro + %things_map + %to_skip + %user_sub + %valid_index + %value + @T2H_CHAPTER_BUTTONS + @T2H_MISC_BUTTONS + @T2H_SECTION_BUTTONS + @appendix_sec_num + @args + @doc_lines + @fhs + @foot_lines + @html_stack + @input_spool + @l2h_from_html + @l2h_to_latex + @lines + @lines2 + @lines3 + @normal_sec_num + @sections + @stoc_lines + @tables + @toc_lines + ); + +#++############################################################################## +# +# NOTE FOR DEBUGGING THIS SCRIPT: +# You can run 'perl texi2html.pl' directly, provided you have +# the environment variable T2H_HOME set to the directory containing +# the texi2html.init file +# +#--############################################################################## + +# CVS version: +# $Id: texi2html,v 1.3 2005-06-19 03:20:26 blp Exp $ + +# Homepage: +$T2H_HOMEPAGE = "http://texi2html.cvshome.org"; + +# Authors: +$T2H_AUTHORS = <<EOT; +Written by: Lionel Cons <Lionel.Cons\@cern.ch> (original author) + Karl Berry <karl\@freefriends.org> + Olaf Bachmann <obachman\@mathematik.uni-kl.de> + and many others. +Maintained by: Many creative people <dev\@texi2html.cvshome.org> +Send bugs and suggestions to <users\@texi2html.cvshome.org> +EOT + +# Version: set in configure.in +$THISVERSION = '1.66'; +$THISPROG = "texi2html $THISVERSION"; # program name and version + +# The man page for this program is included at the end of this file and can be +# viewed using the command 'nroff -man texi2html'. + +#+++############################################################################ +# # +# Initialization # +# Pasted content of File $(srcdir)/texi2html.init: Default initializations # +# # +#---############################################################################ + +# leave this within comments, and keep the require statement +# This way, you can directly run texi2html.pl, if $ENV{T2H_HOME}/texi2html.init +# exists. + +# +# -*-perl-*- +###################################################################### +# File: texi2html.init +# +# Sets default values for command-line arguments and for various customizable +# procedures +# +# A copy of this file is pasted into the beginning of texi2html by +# 'make texi2html' +# +# Copy this file and make changes to it, if you like. +# Afterwards, either, load it with command-line option -init_file <your_init_file> +# +# $Id: texi2html,v 1.3 2005-06-19 03:20:26 blp Exp $ + +###################################################################### +# stuff which can also be set by command-line options +# +# +# Note: values set here, overwrite values set by the command-line +# options before -init_file and might still be overwritten by +# command-line arguments following the -init_file option +# + +# T2H_OPTIONS is a hash whose keys are the (long) names of valid +# command-line options and whose values are a hash with the following keys: +# type ==> one of !|=i|:i|=s|:s (see GetOpt::Long for more info) +# linkage ==> ref to scalar, array, or subroutine (see GetOpt::Long for more info) +# verbose ==> short description of option (displayed by -h) +# noHelp ==> if 1 -> for "not so important options": only print description on -h 1 +# 2 -> for obsolete options: only print description on -h 2 + +my $T2H_DEBUG = 0; +my $T2H_OPTIONS; +$T2H_OPTIONS -> {debug} = +{ + type => '=i', + linkage => \$T2H_DEBUG, + verbose => 'output HTML with debuging information', +}; + +# APA: Add SystemLiteral to identify the canonical DTD. +# [Definition:] The SystemLiteral is called the entity's system +# identifier. It is a URI, which may be used to retrieve the entity. +# See http://www.xml.com/axml/target.html#NT-ExternalID +my $T2H_DOCTYPE = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html40/loose.dtd">'; +$T2H_OPTIONS -> {doctype} = +{ + type => '=s', + linkage => \$T2H_DOCTYPE, + verbose => 'document type which is output in header of HTML files', + noHelp => 1 +}; + +my $T2H_CHECK = 0; +$T2H_OPTIONS -> {check} = +{ + type => '!', + linkage => \$T2H_CHECK, + verbose => 'if set, only check files and output all things that may be Texinfo commands', + noHelp => 1 +}; + +# -expand +# if set to "tex" (or, "info") expand @iftex and @tex (or, @ifinfo) sections +# else, neither expand @iftex, @tex, nor @ifinfo sections +my $T2H_EXPAND = "info"; +$T2H_OPTIONS -> {expand} = +{ + type => '=s', + linkage => \$T2H_EXPAND, + verbose => 'Expand info|tex|none section of texinfo source', +}; + +# - glossary +# If set, uses section named `Footnotes' for glossary. +my $T2H_USE_GLOSSARY = 0; +$T2H_OPTIONS -> {glossary} = +{ + type => '!', + linkage => \$T2H_USE_GLOSSARY, + verbose => "if set, uses section named `Footnotes' for glossary", + noHelp => 1, +}; + + +# -invisible +# $T2H_INVISIBLE_MARK is the text used to create invisible destination +# anchors for index links (you can for instance use the invisible.xbm +# file shipped with this program). This is a workaround for a known +# bug of many WWW browsers, including netscape. +# For me, it works fine without it -- on the contrary: if there, it +# inserts space between headers and start of text (obachman 3/99) +my $T2H_INVISIBLE_MARK = ''; +# $T2H_INVISIBLE_MARK = ' '; +$T2H_OPTIONS -> {invisible} = +{ + type => '=s', + linkage => \$T2H_INVISIBLE_MARK, + verbose => 'use text in invisble anchot', + noHelp => 1, +}; + +# -iso +# if set, ISO8859 characters are used for special symbols (like copyright, etc) +my $T2H_USE_ISO = 0; +$T2H_OPTIONS -> {iso} = +{ + type => 'iso', + linkage => \$T2H_USE_ISO, + verbose => 'if set, ISO8859 characters are used for special symbols (like copyright, etc)', + noHelp => 1, +}; + +# -I +# list directories where @include files are searched for (besides the +# directory of the doc file) additional '-I' args add to this list +# APA: Don't implicitely search ., to conform with the docs! +# my @T2H_INCLUDE_DIRS = ("."); +my @T2H_INCLUDE_DIRS = (); +$T2H_OPTIONS -> {I} = +{ + type => '=s', + linkage => \@T2H_INCLUDE_DIRS, + verbose => 'append $s to the @include search path', +}; + +# -top_file +# uses file of this name for top-level file +# extension is manipulated appropriately, if necessary. +# If empty, <basename of document>.html is used. +# Typically, you would set this to "index.html". +my $T2H_TOP_FILE = ''; +$T2H_OPTIONS -> {top_file} = +{ + type => '=s', + linkage => \$T2H_TOP_FILE, + verbose => 'use $s as top file, instead of <docname>.html', +}; + + +# -toc_file +# uses file of this name for table of contents. File +# extension is manipulated appropriately, if necessary. +# If empty, <basename of document>_toc.html is used. +my $T2H_TOC_FILE = ''; +$T2H_OPTIONS -> {toc_file} = +{ + type => '=s', + linkage => \$T2H_TOC_FILE, + verbose => 'use $s as ToC file, instead of <docname>_toc.html', +}; + +# -frames +# if set, output two additional files which use HTML 4.0 "frames". +my $T2H_FRAMES = 0; +$T2H_OPTIONS -> {frames} = +{ + type => '!', + linkage => \$T2H_FRAMES, + verbose => 'output files which use HTML 4.0 frames (experimental)', + noHelp => 1, +}; + + +# -menu | -nomenu +# if set, show the Texinfo menus +my $T2H_SHOW_MENU = 1; +$T2H_OPTIONS -> {menu} = +{ + type => '!', + linkage => \$T2H_SHOW_MENU, + verbose => 'ouput Texinfo menus', +}; + +# -number | -nonumber +# if set, number sections and show section names and numbers in references +# and menus +my $T2H_NUMBER_SECTIONS = 1; +$T2H_OPTIONS -> {number} = +{ + type => '!', + linkage => \$T2H_NUMBER_SECTIONS, + verbose => 'use numbered sections' +}; + +# if set, and T2H_NUMBER_SECTIONS is set, then use node names in menu +# entries, instead of section names +my $T2H_NODE_NAME_IN_MENU = 0; + +# if set and menu entry equals menu descr, then do not print menu descr. +# Likewise, if node name equals entry name, do not print entry name. +my $T2H_AVOID_MENU_REDUNDANCY = 1; + +# -split section|chapter|none +# if set to 'section' (resp. 'chapter') create one html file per (sub)section +# (resp. chapter) and separate pages for Top, ToC, Overview, Index, +# Glossary, About. +# Otherwise, create a monolithic html file that contains the whole document. +#$T2H_SPLIT = 'section'; +my $T2H_SPLIT = ''; +$T2H_OPTIONS -> {split} = +{ + type => '=s', + linkage => \$T2H_SPLIT, + verbose => 'split document on section|chapter else no splitting', +}; + +# -section_navigation|-no-section_navigation +# if set, then navigation panels are printed at the beginning of each section +# and, possibly at the end (depending on whether or not there were more than +# $T2H_WORDS_IN_PAGE words on page +# This is most useful if you do not want to have section navigation +# on -split chapter +my $T2H_SECTION_NAVIGATION = 1; +$T2H_OPTIONS -> {sec_nav} = +{ + type => '!', + linkage => \$T2H_SECTION_NAVIGATION, + verbose => 'output navigation panels for each section', +}; + +# -subdir +# If set, then put result files into the specified directory. +# If not set, then result files are put into the current directory. +#$T2H_SUBDIR = 'html'; +my $T2H_SUBDIR = ''; +$T2H_OPTIONS -> {subdir} = +{ + type => '=s', + linkage => \$T2H_SUBDIR, + verbose => 'put HTML files in directory $s, instead of $cwd', +}; + +# -short_extn +# If this is set, then all HTML files will have extension ".htm" instead of +# ".html". This is helpful when shipping the document to DOS-based systems. +my $T2H_SHORTEXTN = 0; +$T2H_OPTIONS -> {short_ext} = +{ + type => '!', + linkage => \$T2H_SHORTEXTN, + verbose => 'use "htm" extension for output HTML files', +}; + + +# -prefix +# Set the output file prefix, prepended to all .html, .gif and .pl files. +# By default, this is the basename of the document +my $T2H_PREFIX = ''; +$T2H_OPTIONS -> {prefix} = +{ + type => '=s', + linkage => \$T2H_PREFIX, + verbose => 'use as prefix for output files, instead of <docname>', +}; + +# -o filename +# If set, generate monolithic document output html into $filename +my $T2H_OUT = ''; +$T2H_OPTIONS -> {out_file} = +{ + type => '=s', + linkage => sub {$T2H_OUT = $_[1]; $T2H_SPLIT = '';}, + verbose => 'if set, all HTML output goes into file $s', +}; + +# -short_ref +#if set cross-references are given without section numbers +my $T2H_SHORT_REF = ''; +$T2H_OPTIONS -> {short_ref} = +{ + type => '!', + linkage => \$T2H_SHORT_REF, + verbose => 'if set, references are without section numbers', +}; + +# -idx_sum +# if value is set, then for each @prinindex $what +# $docu_name_$what.idx is created which contains lines of the form +# $key\t$ref sorted alphabetically (case matters) +my $T2H_IDX_SUMMARY = 0; +$T2H_OPTIONS -> {idx_sum} = +{ + type => '!', + linkage => \$T2H_IDX_SUMMARY, + verbose => 'if set, also output index summary', + noHelp => 1, +}; + +# -def_table +# Use a table construction for @def .... stuff instead +# New Option: 27.07.2000 Karl Heinz Marbaise +my $T2H_DEF_TABLE = 0; +$T2H_OPTIONS -> {def_table} = +{ + type => '!', + linkage => \$T2H_DEF_TABLE, + verbose => 'if set, \@def.. are converted using tables.', + noHelp => 1, +}; + +# -verbose +# if set, chatter about what we are doing +my $T2H_VERBOSE = ''; +$T2H_OPTIONS -> {Verbose} = +{ + type => '!', + linkage => \$T2H_VERBOSE, + verbose => 'print progress info to stdout', +}; + +# -lang +# For page titles use $T2H_WORDS->{$T2H_LANG}->{...} as title. +# To add a new language, supply list of titles (see $T2H_WORDS below). +# and use ISO 639 language codes (see e.g. perl module Locale-Codes-1.02 +# for definitions) +# Default's to 'en' if not set or no @documentlanguage is specified +my $T2H_LANG = ''; +$T2H_OPTIONS -> {lang} = +{ + type => '=s', + linkage => sub {SetDocumentLanguage($_[1])}, + verbose => 'use $s as document language (ISO 639 encoding)', +}; + +# -l2h +# if set, uses latex2html for generation of math content +my $T2H_L2H = ''; +$T2H_OPTIONS -> {l2h} = +{ + type => '!', + linkage => \$T2H_L2H, + verbose => 'if set, uses latex2html for @math and @tex', +}; + +###################### +# The following options are only relevant if $T2H_L2H is set +# +# -l2h_l2h +# name/location of latex2html program +my $T2H_L2H_L2H = "latex2html"; +$T2H_OPTIONS -> {l2h_l2h} = +{ + type => '=s', + linkage => \$T2H_L2H_L2H, + verbose => 'program to use for latex2html translation', + noHelp => 1, +}; + +# -l2h_skip +# If set, skips actual call to latex2html: tries to reuse previously generated +# content, instead. +my $T2H_L2H_SKIP = ''; +$T2H_OPTIONS -> {l2h_skip} = +{ + type => '!', + linkage => \$T2H_L2H_SKIP, + verbose => 'if set, tries to reuse previously latex2html output', + noHelp => 1, +}; + +# -l2h_tmp +# If set, l2h uses the specified directory for temporary files. The path +# leading to this directory may not contain a dot (i.e., a "."); +# otherwise, l2h will fail. +my $T2H_L2H_TMP = ''; +$T2H_OPTIONS -> {l2h_tmp} = +{ + type => '=s', + linkage => \$T2H_L2H_TMP, + verbose => 'if set, uses $s as temporary latex2html directory', + noHelp => 1, +}; + +# if set, cleans intermediate files (they all have the prefix $doc_l2h_) +# of l2h +my $T2H_L2H_CLEAN = 1; +$T2H_OPTIONS -> {l2h_clean} = +{ + type => '!', + linkage => \$T2H_L2H_CLEAN, + verbose => 'if set, do not keep intermediate latex2html files for later reuse', + noHelp => 1, +}; + +$T2H_OPTIONS -> {D} = +{ + type => '=s', + linkage => sub {$main::value{$_[1]} = 1;}, + verbose => 'equivalent to Texinfo "@set $s 1"', + noHelp => 1, +}; + +$T2H_OPTIONS -> {init_file} = +{ + type => '=s', + linkage => \&LoadInitFile, + verbose => 'load init file $s' +}; + + +############################################################################## +# +# The following can only be set in the init file +# +############################################################################## + +# if set, center @image by default +# otherwise, do not center by default +my $T2H_CENTER_IMAGE = 1; + +# used as identation for block enclosing command @example, etc +# If not empty, must be enclosed in <td></td> +my $T2H_EXAMPLE_INDENT_CELL = '<td> </td>'; +# same as above, only for @small +my $T2H_SMALL_EXAMPLE_INDENT_CELL = '<td> </td>'; +# font size for @small +my $T2H_SMALL_FONT_SIZE = '-1'; + +# if non-empty, and no @..heading appeared in Top node, then +# use this as header for top node/section, otherwise use value of +# @settitle or @shorttitle (in that order) +my $T2H_TOP_HEADING = ''; + +# if set, use this chapter for 'Index' button, else +# use first chapter whose name matches 'index' (case insensitive) +my $T2H_INDEX_CHAPTER = ''; + +# if set and $T2H_SPLIT is set, then split index pages at the next letter +# after they have more than that many entries +my $T2H_SPLIT_INDEX = 100; + +# if set (e.g., to index.html) replace hrefs to this file +# (i.e., to index.html) by ./ +my $T2H_HREF_DIR_INSTEAD_FILE = ''; + +######################################################################## +# Language dependencies: +# To add a new language extend T2H_WORDS hash and create $T2H_<...>_WORDS hash +# To redefine one word, simply do: +# $T2H_WORDS->{<language>}->{<word>} = 'whatever' in your personal init file. +# +my $T2H_WORDS_EN = +{ + # titles of pages + 'ToC_Title' => 'Table of Contents', + 'Overview_Title' => 'Short Table of Contents', + 'Index_Title' => 'Index', + 'About_Title' => 'About this document', + 'Footnotes_Title' => 'Footnotes', + 'See' => 'See', + 'see' => 'see', + 'section' => 'section', + # If necessary, we could extend this as follows: + # # text for buttons + # 'Top_Button' => 'Top', + # 'ToC_Button' => 'Contents', + # 'Overview_Button' => 'Overview', + # 'Index_button' => 'Index', + # 'Back_Button' => 'Back', + # 'FastBack_Button' => 'FastBack', + # 'Prev_Button' => 'Prev', + # 'Up_Button' => 'Up', + # 'Next_Button' => 'Next', + # 'Forward_Button' =>'Forward', + # 'FastWorward_Button' => 'FastForward', + # 'First_Button' => 'First', + # 'Last_Button' => 'Last', + # 'About_Button' => 'About' +}; + +my $T2H_WORDS_DE = +{ + 'ToC_Title' => 'Inhaltsverzeichniss', + 'Overview_Title' => 'Kurzes Inhaltsverzeichniss', + 'Index_Title' => 'Index', + 'About_Title' => 'Über dieses Dokument', + 'Footnotes_Title' => 'Fußnoten', + 'See' => 'Siehe', + 'see' => 'siehe', + 'section' => 'Abschnitt', +}; + +my $T2H_WORDS_NL = +{ + 'ToC_Title' => 'Inhoudsopgave', + 'Overview_Title' => 'Korte inhoudsopgave', + 'Index_Title' => 'Index', #Not sure ;-) + 'About_Title' => 'No translation available!', #No translation available! + 'Footnotes_Title' => 'No translation available!', #No translation available! + 'See' => 'Zie', + 'see' => 'zie', + 'section' => 'sectie', +}; + +my $T2H_WORDS_ES = +{ + 'ToC_Title' => 'índice General', + 'Overview_Title' => 'Resumen del Contenido', + 'Index_Title' => 'Index', #Not sure ;-) + 'About_Title' => 'No translation available!', #No translation available! + 'Footnotes_Title' => 'Fußnoten', + 'See' => 'Véase', + 'see' => 'véase', + 'section' => 'sección', +}; + +my $T2H_WORDS_NO = +{ + 'ToC_Title' => 'Innholdsfortegnelse', + 'Overview_Title' => 'Kort innholdsfortegnelse', + 'Index_Title' => 'Indeks', #Not sure ;-) + 'About_Title' => 'No translation available!', #No translation available! + 'Footnotes_Title' => 'No translation available!', + 'See' => 'Se', + 'see' => 'se', + 'section' => 'avsnitt', +}; + +my $T2H_WORDS_PT = +{ + 'ToC_Title' => 'Sumário', + 'Overview_Title' => 'Breve Sumário', + 'Index_Title' => 'Índice', #Not sure ;-) + 'About_Title' => 'No translation available!', #No translation available! + 'Footnotes_Title' => 'No translation available!', + 'See' => 'Veja', + 'see' => 'veja', + 'section' => 'Seção', +}; + +my $T2H_WORDS_FR = +{ + 'ToC_Title' => 'Table des mati&egrav;res', + 'Overview_Title' => 'Résumée du contenu', + 'Index_Title' => 'Index', + 'About_Title' => 'A propos de ce document', + 'Footnotes_Title' => 'Notes de bas de page', + 'See' => 'Voir', + 'see' => 'voir', + 'section' => 'section', +}; + +my $T2H_WORDS = +{ + 'en' => $T2H_WORDS_EN, + 'de' => $T2H_WORDS_DE, + 'nl' => $T2H_WORDS_NL, + 'es' => $T2H_WORDS_ES, + 'no' => $T2H_WORDS_NO, + 'pt' => $T2H_WORDS_PT, + 'fr' => $T2H_WORDS_FR +}; + +my @MONTH_NAMES_EN = + ( + 'January', 'February', 'March', 'April', 'May', + 'June', 'July', 'August', 'September', 'October', + 'November', 'December' + ); + +my @MONTH_NAMES_DE = + ( + 'Januar', 'Februar', 'März', 'April', 'Mai', + 'Juni', 'Juli', 'August', 'September', 'Oktober', + 'November', 'Dezember' + ); + +my @MONTH_NAMES_NL = + ( + 'Januari', 'Februari', 'Maart', 'April', 'Mei', + 'Juni', 'Juli', 'Augustus', 'September', 'Oktober', + 'November', 'December' + ); + +my @MONTH_NAMES_ES = + ( + 'enero', 'febrero', 'marzo', 'abril', 'mayo', + 'junio', 'julio', 'agosto', 'septiembre', 'octubre', + 'noviembre', 'diciembre' + ); + +my @MONTH_NAMES_NO = + ( + + 'januar', 'februar', 'mars', 'april', 'mai', + 'juni', 'juli', 'august', 'september', 'oktober', + 'november', 'desember' + ); + +my @MONTH_NAMES_PT = + ( + 'Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', + 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', + 'Novembro', 'Dezembro' + ); + +my @MONTH_NAMES_FR = +( + 'Janvier', 'Février', 'Mars', 'Avril', 'Mai', + 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', + 'Novembre', 'Décembre' +); + + + +my $MONTH_NAMES = +{ + 'en' => \@MONTH_NAMES_EN, + 'de' => \@MONTH_NAMES_DE, + 'es' => \@MONTH_NAMES_ES, + 'nl' => \@MONTH_NAMES_NL, + 'no' => \@MONTH_NAMES_NO, + 'pt' => \@MONTH_NAMES_PT, + 'fr' => \@MONTH_NAMES_FR +}; + +######################################################################## +# Control of Page layout: +# You can make changes of the Page layout at two levels: +# 1.) For small changes, it is often enough to change the value of +# some global string/hash/array variables +# 2.) For larger changes, reimplement one of the T2H_DEFAULT_<fnc>* routines, +# give them another name, and assign them to the respective +# $T2H_<fnc> variable. + +# As a general interface, the hashes T2H_HREF, T2H_NAME, T2H_NODE hold +# href, html-name, node-name of +# This -- current section (resp. html page) +# Top -- top page ($T2H_TOP_FILE) +# Contents -- Table of contents +# Overview -- Short table of contents +# Index -- Index page +# About -- page which explain "navigation buttons" +# First -- first node +# Last -- last node +# +# Whether or not the following hash values are set, depends on the context +# (all values are w.r.t. 'This' section) +# Next -- next node of texinfo +# Prev -- previous node of texinfo +# Up -- up node of texinfo +# Forward -- next node in reading order +# Back -- previous node in reading order +# FastForward -- if leave node, up and next, else next node +# FastBackward-- if leave node, up and prev, else prev node +# +# Furthermore, the following global variabels are set: +# $T2H_THISDOC{title} -- title as set by @setttile +# $T2H_THISDOC{fulltitle} -- full title as set by @title... +# $T2H_THISDOC{subtitle} -- subtitle as set by @subtitle +# $T2H_THISDOC{author} -- author as set by @author +# +# and pointer to arrays of lines which need to be printed by t2h_print_lines +# $T2H_OVERVIEW -- lines of short table of contents +# $T2H_TOC -- lines of table of contents +# $T2H_TOP -- lines of Top texinfo node +# $T2H_THIS_SECTION -- lines of 'This' section + +# +# There are the following subs which control the layout: +# +my $T2H_print_section = \&T2H_DEFAULT_print_section; +my $T2H_print_Top_header = \&T2H_DEFAULT_print_Top_header; +my $T2H_print_Top_footer = \&T2H_DEFAULT_print_Top_footer; +my $T2H_print_Top = \&T2H_DEFAULT_print_Top; +my $T2H_print_Toc = \&T2H_DEFAULT_print_Toc; +my $T2H_print_Overview = \&T2H_DEFAULT_print_Overview; +my $T2H_print_Footnotes = \&T2H_DEFAULT_print_Footnotes; +my $T2H_print_About = \&T2H_DEFAULT_print_About; +my $T2H_print_misc_header = \&T2H_DEFAULT_print_misc_header; +my $T2H_print_misc_footer = \&T2H_DEFAULT_print_misc_footer; +my $T2H_print_misc = \&T2H_DEFAULT_print_misc; +my $T2H_print_chapter_header = \&T2H_DEFAULT_print_chapter_header; +my $T2H_print_chapter_footer = \&T2H_DEFAULT_print_chapter_footer; +my $T2H_print_page_head = \&T2H_DEFAULT_print_page_head; +my $T2H_print_page_foot = \&T2H_DEFAULT_print_page_foot; +my $T2H_print_head_navigation = \&T2H_DEFAULT_print_head_navigation; +my $T2H_print_foot_navigation = \&T2H_DEFAULT_print_foot_navigation; +my $T2H_button_icon_img = \&T2H_DEFAULT_button_icon_img; +my $T2H_print_navigation = \&T2H_DEFAULT_print_navigation; +my $T2H_about_body = \&T2H_DEFAULT_about_body; +my $T2H_print_frame = \&T2H_DEFAULT_print_frame; +my $T2H_print_toc_frame = \&T2H_DEFAULT_print_toc_frame; + +######################################################################## +# Layout for html for every sections +# +sub T2H_DEFAULT_print_section +{ + my $fh = shift; + local $T2H_BUTTONS = \@T2H_SECTION_BUTTONS; + &$T2H_print_head_navigation($fh) if $T2H_SECTION_NAVIGATION; + my $nw = t2h_print_lines($fh); + if (defined $T2H_SPLIT + and ($T2H_SPLIT eq 'section' && $T2H_SECTION_NAVIGATION)) + { + &$T2H_print_foot_navigation($fh, $nw); + } + else + { + print $fh '<HR SIZE="6">' . "\n"; + } +} + +################################################################### +# Layout of top-page I recommend that you use @ifnothtml, @ifhtml, +# @html within the Top texinfo node to specify content of top-level +# page. +# +# If you enclose everything in @ifnothtml, then title, subtitle, +# author and overview is printed +# T2H_HREF of Next, Prev, Up, Forward, Back are not defined +# if $T2H_SPLIT then Top page is in its own html file +sub T2H_DEFAULT_print_Top_header +{ + &$T2H_print_page_head(@_) if $T2H_SPLIT; + t2h_print_label(@_); # this needs to be called, otherwise no label set + &$T2H_print_head_navigation(@_); +} +sub T2H_DEFAULT_print_Top_footer +{ + &$T2H_print_foot_navigation(@_); + &$T2H_print_page_foot(@_) if $T2H_SPLIT; +} +sub T2H_DEFAULT_print_Top +{ + my $fh = shift; + + # for redefining navigation buttons use: + # local $T2H_BUTTONS = [...]; + # as it is, 'Top', 'Contents', 'Index', 'About' are printed + local $T2H_BUTTONS = \@T2H_MISC_BUTTONS; + &$T2H_print_Top_header($fh); + if ($T2H_THIS_SECTION) + { + # if top-level node has content, then print it with extra header + print $fh "<H1>$T2H_NAME{Top}</H1>\n" + unless ($T2H_HAS_TOP_HEADING); + t2h_print_lines($fh, $T2H_THIS_SECTION) + } + else + { + # top-level node is fully enclosed in @ifnothtml + # print fulltitle, subtitle, author, Overview + print $fh + "<CENTER>\n<H1>" . + join("</H1>\n<H1>", split(/\n/, $T2H_THISDOC{fulltitle})) . + "</H1>\n"; + print $fh "<H2>$T2H_THISDOC{subtitle}</H2>\n" if $T2H_THISDOC{subtitle}; + print $fh "$T2H_THISDOC{author}\n" if $T2H_THISDOC{author}; + print $fh <<EOT; +</CENTER> +<HR> +<P></P> +<H2> Overview: </H2> +<BLOCKQUOTE> +EOT + t2h_print_lines($fh, $T2H_OVERVIEW); + print $fh "</BLOCKQUOTE>\n"; + } + &$T2H_print_Top_footer($fh); +} + +################################################################### +# Layout of Toc, Overview, and Footnotes pages +# By default, we use "normal" layout +# T2H_HREF of Next, Prev, Up, Forward, Back, etc are not defined +# use: local $T2H_BUTTONS = [...] to redefine navigation buttons +sub T2H_DEFAULT_print_Toc +{ + return &$T2H_print_misc(@_); +} +sub T2H_DEFAULT_print_Overview +{ + return &$T2H_print_misc(@_); +} +sub T2H_DEFAULT_print_Footnotes +{ + return &$T2H_print_misc(@_); +} +sub T2H_DEFAULT_print_About +{ + return &$T2H_print_misc(@_); +} + +sub T2H_DEFAULT_print_misc_header +{ + &$T2H_print_page_head(@_) if $T2H_SPLIT; + # this needs to be called, otherwise, no labels are set + t2h_print_label(@_); + &$T2H_print_head_navigation(@_); +} +sub T2H_DEFAULT_print_misc_footer +{ + &$T2H_print_foot_navigation(@_); + &$T2H_print_page_foot(@_) if $T2H_SPLIT; +} +sub T2H_DEFAULT_print_misc +{ + my $fh = shift; + local $T2H_BUTTONS = \@T2H_MISC_BUTTONS; + &$T2H_print_misc_header($fh); + print $fh "<H1>$T2H_NAME{This}</H1>\n"; + t2h_print_lines($fh); + &$T2H_print_misc_footer($fh); +} + +################################################################### +# chapter_header and chapter_footer are only called if +# T2H_SPLIT eq 'chapter' +# chapter_header: after print_page_head, before print_section +# chapter_footer: after print_section of last section, before print_page_foot +# +# If you want to get rid of navigation stuff after each section, +# redefine print_section such that it does not call print_navigation, +# and put print_navigation into print_chapter_header +@T2H_CHAPTER_BUTTONS = + ( + 'FastBack', 'FastForward', ' ', + ' ', ' ', ' ', ' ', + 'Top', 'Contents', 'Index', 'About', + ); + +sub T2H_DEFAULT_print_chapter_header +{ + # nothing to do there, by default + if (! $T2H_SECTION_NAVIGATION) + { + my $fh = shift; + local $T2H_BUTTONS = \@T2H_CHAPTER_BUTTONS; + &$T2H_print_navigation($fh); + print $fh "\n<HR SIZE=2>\n"; + } +} + +sub T2H_DEFAULT_print_chapter_footer +{ + local $T2H_BUTTONS = \@T2H_CHAPTER_BUTTONS; + &$T2H_print_navigation(@_); +} +################################################################### + +sub pretty_date { + my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst); + + ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); + $year += ($year < 70) ? 2000 : 1900; + # obachman: Let's do it as the Americans do + return($MONTH_NAMES->{$T2H_LANG}[$mon] . ", " . $mday . " " . $year); +} + + +################################################################### +# Layout of standard header and footer +# + +# This init routine is called at the beginning of pass5 before first +# output is generated. +sub T2H_InitGlobals +{ + # Set the default body text, inserted between <BODY ... > + $T2H_BODYTEXT = 'LANG="' . $T2H_LANG . '" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"'; + # text inserted after <BODY ...> + $T2H_AFTER_BODY_OPEN = ''; + #text inserted before </BODY> + $T2H_PRE_BODY_CLOSE = ''; + # this is used in footer + $T2H_ADDRESS = "<I>$T2H_USER</I> " if $T2H_USER; + $T2H_ADDRESS .= "on <I>$T2H_TODAY</I>"; + # this is added inside <HEAD></HEAD> after <TITLE> and some META NAME stuff + # can be used for <style> <script>, <meta> tags + $T2H_EXTRA_HEAD = ''; +} + +sub T2H_DEFAULT_print_page_head +{ + my $fh = shift; + my $longtitle = "$T2H_THISDOC{title}"; + $longtitle .= ": $T2H_NAME{This}" if exists $T2H_NAME{This}; + print $fh <<EOT; +$T2H_DOCTYPE +<HTML> +<!-- Created on $T2H_TODAY by $THISPROG --> +<!-- +$T2H_AUTHORS +--> +<HEAD> +<TITLE>$longtitle + + + + + + +$T2H_EXTRA_HEAD + + + +$T2H_AFTER_BODY_OPEN +EOT +} + +sub T2H_DEFAULT_print_page_foot +{ + my $fh = shift; + print $fh < + +This document was generated +by $T2H_ADDRESS +using texi2html + +$T2H_PRE_BODY_CLOSE + + +EOT +} + +################################################################### +# Layout of navigation panel + +# if this is set, then a vertical navigation panel is used +my $T2H_VERTICAL_HEAD_NAVIGATION = 0; +sub T2H_DEFAULT_print_head_navigation +{ + my $fh = shift; + if ($T2H_VERTICAL_HEAD_NAVIGATION) + { + print $fh < + + +EOT + } + &$T2H_print_navigation($fh, $T2H_VERTICAL_HEAD_NAVIGATION); + if ($T2H_VERTICAL_HEAD_NAVIGATION) + { + print $fh < + +EOT + } + elsif (defined $T2H_SPLIT + and ($T2H_SPLIT eq 'section')) + { + print $fh "
\n"; + } +} + +# Specifies the minimum page length required before a navigation panel +# is placed at the bottom of a page (the default is that of latex2html) +# T2H_THIS_WORDS_IN_PAGE holds number of words of current page +my $T2H_WORDS_IN_PAGE = 300; +sub T2H_DEFAULT_print_foot_navigation +{ + my $fh = shift; + my $nwords = shift; + if ($T2H_VERTICAL_HEAD_NAVIGATION) + { + print $fh < + + +EOT + } + print $fh "
\n"; + &$T2H_print_navigation($fh) if (defined $nwords + and $nwords >= $T2H_WORDS_IN_PAGE) +} + +###################################################################### +# navigation panel +# +# specify in this array which "buttons" should appear in which order +# in the navigation panel for sections; use ' ' for empty buttons (space) +@T2H_SECTION_BUTTONS = + ( + 'Back', 'Forward', ' ', 'FastBack', 'Up', 'FastForward', + ' ', ' ', ' ', ' ', + 'Top', 'Contents', 'Index', 'About', + ); + +# buttons for misc stuff +@T2H_MISC_BUTTONS = ('Top', 'Contents', 'Index', 'About'); + +# insert here name of icon images for buttons +# Icons are used, if $T2H_ICONS and resp. value are set +%T2H_ACTIVE_ICONS = + ( + 'Top', '', + 'Contents', '', + 'Overview', '', + 'Index', '', + 'Back', '', + 'FastBack', '', + 'Prev', '', + 'Up', '', + 'Next', '', + 'Forward', '', + 'FastForward', '', + 'About' , '', + 'First', '', + 'Last', '', + ' ', '' + ); + +# insert here name of icon images for these, if button is inactive +%T2H_PASSIVE_ICONS = + ( + 'Top', '', + 'Contents', '', + 'Overview', '', + 'Index', '', + 'Back', '', + 'FastBack', '', + 'Prev', '', + 'Up', '', + 'Next', '', + 'Forward', '', + 'FastForward', '', + 'About', '', + 'First', '', + 'Last', '', + ); + +# how to create IMG tag +sub T2H_DEFAULT_button_icon_img +{ + my $button = shift; + my $icon = shift; + my $name = shift; + return qq{$button: $name}; +} + +# Names of text as alternative for icons +%T2H_NAVIGATION_TEXT = + ( + 'Top', 'Top', + 'Contents', 'Contents', + 'Overview', 'Overview', + 'Index', 'Index', + ' ', '   ', + 'Back', ' < ', + 'FastBack', ' << ', + 'Prev', 'Prev', + 'Up', ' Up ', + 'Next', 'Next', + 'Forward', ' > ', + 'FastForward', ' >> ', + 'About', ' ? ', + 'First', ' |< ', + 'Last', ' >| ' + ); + +sub T2H_DEFAULT_print_navigation +{ + my $fh = shift; + my $vertical = shift; + my $spacing = 1; + print $fh "\n"; + + print $fh "" unless $vertical; + for $button (@$T2H_BUTTONS) + { + print $fh qq{\n} if $vertical; + print $fh qq{\n"; + print $fh "\n" if $vertical; + } + print $fh "" unless $vertical; + print $fh "
}; + + if (ref($button) eq 'CODE') + { + &$button($fh, $vertical); + } + elsif ($button eq ' ') + { # handle space button + print $fh + $T2H_ICONS && $T2H_ACTIVE_ICONS{' '} ? + &$T2H_button_icon_img($button, $T2H_ACTIVE_ICONS{' '}) : + $T2H_NAVIGATION_TEXT{' '}; + next; + } + elsif ($T2H_HREF{$button}) + { # button is active + print $fh + $T2H_ICONS && $T2H_ACTIVE_ICONS{$button} ? # use icon ? + t2h_anchor('', $T2H_HREF{$button}, # yes + &$T2H_button_icon_img($button, + $T2H_ACTIVE_ICONS{$button}, + $T2H_NAME{$button})) + : # use text + "[" . + t2h_anchor('', $T2H_HREF{$button}, $T2H_NAVIGATION_TEXT{$button}) . + "]"; + } + else + { # button is passive + print $fh + $T2H_ICONS && $T2H_PASSIVE_ICONS{$button} ? + &$T2H_button_icon_img($button, + $T2H_PASSIVE_ICONS{$button}, + $T2H_NAME{$button}) : + + "[" . $T2H_NAVIGATION_TEXT{$button} . "]"; + } + print $fh "
\n"; +} + +###################################################################### +# Frames: this is from "Richard Y. Kim" +# Should be improved to be more conforming to other _print* functions + +sub T2H_DEFAULT_print_frame +{ + my $fh = shift; + print $fh < +$T2H_THISDOC{title} + + + + + +EOT +} + +sub T2H_DEFAULT_print_toc_frame +{ + my $fh = shift; + &$T2H_print_page_head($fh); + print $fh <Content +EOT + print $fh map {s/HREF=/target=\"main\" HREF=/; $_;} @stoc_lines; + print $fh "\n"; +} + +###################################################################### +# About page +# + +# T2H_PRE_ABOUT might be a function +my $T2H_PRE_ABOUT = <texi2html +

+EOT +my $T2H_AFTER_ABOUT = ''; + +sub T2H_DEFAULT_about_body +{ + my $about; + if (ref($T2H_PRE_ABOUT) eq 'CODE') + { + $about = &$T2H_PRE_ABOUT(); + } + else + { + $about = $T2H_PRE_ABOUT; + } + $about .= <

+ + + + + + + +EOT + + for $button (@T2H_SECTION_BUTTONS) + { + next if $button eq ' ' || ref($button) eq 'CODE'; + $about .= < + + + + +EOT + } + + $about .= < +

+ where the Example assumes that the current position + is at Subsubsection One-Two-Three of a document of + the following structure:

+
    +
  • 1. Section One +
      +
    • 1.1 Subsection One-One +
        +
      • ...
      • +
      +
    • 1.2 Subsection One-Two +
        +
      • 1.2.1 Subsubsection One-Two-One
      • +
      • 1.2.2 Subsubsection One-Two-Two
      • +
      • 1.2.3 Subsubsection One-Two-Three     + <== Current Position
      • +
      • 1.2.4 Subsubsection One-Two-Four
      • +
      +
    • +
    • 1.3 Subsection One-Three +
        +
      • ...
      • +
      +
    • +
    • 1.4 Subsection One-Four
    • +
    +
  • +
+$T2H_AFTER_ABOUT +EOT + return $about; +} + + +%T2H_BUTTONS_GOTO = + ( + 'Top', 'cover (top) of document', + 'Contents', 'table of contents', + 'Overview', 'short table of contents', + 'Index', 'concept index', + 'Back', 'previous section in reading order', + 'FastBack', 'beginning of this chapter or previous chapter', + 'Prev', 'previous section same level', + 'Up', 'up section', + 'Next', 'next section same level', + 'Forward', 'next section in reading order', + 'FastForward', 'next chapter', + 'About' , 'this page', + 'First', 'first section in reading order', + 'Last', 'last section in reading order', + ); + +%T2H_BUTTONS_EXAMPLE = + ( + 'Top', '   ', + 'Contents', '   ', + 'Overview', '   ', + 'Index', '   ', + 'Back', '1.2.2', + 'FastBack', '1', + 'Prev', '1.2.2', + 'Up', '1.2', + 'Next', '1.2.4', + 'Forward', '1.2.4', + 'FastForward', '2', + 'About', '   ', + 'First', '1.', + 'Last', '1.2.4', + ); + + +###################################################################### +# from here on, its l2h init stuff +# + +## initialization for latex2html as for Singular manual generation +## obachman 3/99 + +# +# Options controlling Titles, File-Names, Tracing and Sectioning +# +$TITLE = ''; + +$SHORTEXTN = 0; + +$LONG_TITLES = 0; + +$DESTDIR = ''; # should be overwritten by cmd-line argument + +$NO_SUBDIR = 0; # should be overwritten by cmd-line argument + +$PREFIX = ''; # should be overwritten by cmd-line argument + +$AUTO_PREFIX = 0; # this is needed, so that prefix settings are used + +$AUTO_LINK = 0; + +$SPLIT = 0; + +$MAX_LINK_DEPTH = 0; + +$TMP = ''; # should be overwritten by cmd-line argument + +$DEBUG = 0; + +$VERBOSE = 1; + +# +# Options controlling Extensions and Special Features +# +$HTML_VERSION = "3.2"; + +$TEXDEFS = 1; # we absolutely need that + +$EXTERNAL_FILE = ''; + +$SCALABLE_FONTS = 1; + +$NO_SIMPLE_MATH = 1; + +$LOCAL_ICONS = 1; + +$SHORT_INDEX = 0; + +$NO_FOOTNODE = 1; + +$ADDRESS = ''; + +$INFO = ''; + +# +# Switches controlling Image Generation +# +$ASCII_MODE = 0; + +$NOLATEX = 0; + +$EXTERNAL_IMAGES = 0; + +$PS_IMAGES = 0; + +$NO_IMAGES = 0; + +$IMAGES_ONLY = 0; + +$REUSE = 2; + +$ANTI_ALIAS = 1; + +$ANTI_ALIAS_TEXT = 1; + +# +#Switches controlling Navigation Panels +# +$NO_NAVIGATION = 1; +$ADDRESS = ''; +$INFO = 0; # 0 = do not make a "About this document..." section + +# +#Switches for Linking to other documents +# +# currently -- we don't care + +$MAX_SPLIT_DEPTH = 0; # Stop making separate files at this depth + +$MAX_LINK_DEPTH = 0; # Stop showing child nodes at this depth + +$NOLATEX = 0; # 1 = do not pass unknown environments to Latex + +$EXTERNAL_IMAGES = 0; # 1 = leave the images outside the document + +$ASCII_MODE = 0; # 1 = do not use any icons or internal images + +# 1 = use links to external postscript images rather than inlined bitmap +# images. +$PS_IMAGES = 0; +$SHOW_SECTION_NUMBERS = 0; + +### Other global variables ############################################### +$CHILDLINE = ""; + +# This is the line width measured in pixels and it is used to right justify +# equations and equation arrays; +$LINE_WIDTH = 500; + +# Used in conjunction with AUTO_NAVIGATION +$WORDS_IN_PAGE = 300; + +# Affects ONLY the way accents are processed +$default_language = 'english'; + +# The value of this variable determines how many words to use in each +# title that is added to the navigation panel (see below) +# +$WORDS_IN_NAVIGATION_PANEL_TITLES = 0; + +# This number will determine the size of the equations, special characters, +# and anything which will be converted into an inlined image +# *except* "image generating environments" such as "figure", "table" +# or "minipage". +# Effective values are those greater than 0. +# Sensible values are between 0.1 - 4. +$MATH_SCALE_FACTOR = 1.5; + +# This number will determine the size of +# image generating environments such as "figure", "table" or "minipage". +# Effective values are those greater than 0. +# Sensible values are between 0.1 - 4. +$FIGURE_SCALE_FACTOR = 1.6; + + +# If both of the following two variables are set then the "Up" button +# of the navigation panel in the first node/page of a converted document +# will point to $EXTERNAL_UP_LINK. $EXTERNAL_UP_TITLE should be set +# to some text which describes this external link. +$EXTERNAL_UP_LINK = ""; +$EXTERNAL_UP_TITLE = ""; + +# If this is set then the resulting HTML will look marginally better if viewed +# with Netscape. +$NETSCAPE_HTML = 1; + +# Valid paper sizes are "letter", "legal", "a4","a3","a2" and "a0" +# Paper sizes has no effect other than in the time it takes to create inlined +# images and in whether large images can be created at all ie +# - larger paper sizes *MAY* help with large image problems +# - smaller paper sizes are quicker to handle +$PAPERSIZE = "a4"; + +# Replace "english" with another language in order to tell LaTeX2HTML that you +# want some generated section titles (eg "Table of Contents" or "References") +# to appear in a different language. Currently only "english" and "french" +# is supported but it is very easy to add your own. See the example in the +# file "latex2html.config" +$TITLES_LANGUAGE = "english"; + +1; # This must be the last non-comment line + +# End File texi2html.init +###################################################################### + + +require "$ENV{T2H_HOME}/texi2html.init" + if ($0 =~ /\.pl$/ && + -e "$ENV{T2H_HOME}/texi2html.init" && -r "$ENV{T2H_HOME}/texi2html.init"); + +#+++############################################################################ +# # +# Initialization # +# Pasted content of File $(srcdir)/MySimple.pm: Command-line processing # +# # +#---############################################################################ + +# leave this within comments, and keep the require statement +# This way, you can directly run texi2html.pl, if $ENV{T2H_HOME}/texi2html.init +# exists. + +# +package Getopt::MySimple; + +# Name: +# Getopt::MySimple. +# +# Documentation: +# POD-style (incomplete) documentation is in file MySimple.pod +# +# Tabs: +# 4 spaces || die. +# +# Author: +# Ron Savage rpsavage@ozemail.com.au. +# 1.00 19-Aug-97 Initial version. +# 1.10 13-Oct-97 Add arrays of switches (eg '=s@'). +# 1.20 3-Dec-97 Add 'Help' on a per-switch basis. +# 1.30 11-Dec-97 Change 'Help' to 'verbose'. Make all hash keys lowercase. +# 1.40 10-Nov-98 Change width of help report. Restructure tests. +# 1-Jul-00 Modifications for Texi2html + +# -------------------------------------------------------------------------- +# Locally modified by obachman (Display type instead of env, order by cmp) +# $Id: texi2html,v 1.3 2005-06-19 03:20:26 blp Exp $ + +# use strict; +# no strict 'refs'; + +use vars qw(@EXPORT @EXPORT_OK @ISA); +use vars qw($fieldWidth $opt $VERSION); + +use Exporter(); +use Getopt::Long; + +@ISA = qw(Exporter); +@EXPORT = qw(); +@EXPORT_OK = qw($opt); # An alias for $self -> {'opt'}. + +# -------------------------------------------------------------------------- + +$fieldWidth = 20; +$VERSION = '1.41'; + +# -------------------------------------------------------------------------- + +sub byOrder +{ + my($self) = @_; + + return uc($a) cmp (uc($b)); +} + +# -------------------------------------------------------------------------- + +sub dumpOptions +{ + my($self) = @_; + + print 'Option', ' ' x ($fieldWidth - length('Option') ), "Value\n"; + + for (sort byOrder keys(%{$self -> {'opt'} }) ) + { + print "-$_", ' ' x ($fieldWidth - (1 + length) ), "${$self->{'opt'} }{$_}\n"; + } + + print "\n"; + +} # End of dumpOptions. + +# -------------------------------------------------------------------------- +# Return: +# 0 -> Error. +# 1 -> Ok. + +sub getOptions +{ + push(@_, 0) if ($#_ == 2); # Default for $ignoreCase is 0. + push(@_, 1) if ($#_ == 3); # Default for $helpThenExit is 1. + + my($self, $default, $helpText, $versionText, + $helpThenExit, $versionThenExit, $ignoreCase) = @_; + + $helpThenExit = 1 unless (defined($helpThenExit)); + $versionThenExit = 1 unless (defined($versionThenExit)); + $ignoreCase = 0 unless (defined($ignoreCase)); + + $self -> {'default'} = $default; + $self -> {'helpText'} = $helpText; + $self -> {'versionText'} = $versionText; + $Getopt::Long::ignorecase = $ignoreCase; + + unless (defined($self -> {'default'}{'help'})) + { + $self -> {'default'}{'help'} = + { + type => ':i', + default => '', + linkage => sub {$self->helpOptions($_[1]); exit (0) if $helpThenExit;}, + verbose => "print help and exit" + }; + } + + unless (defined($self -> {'default'}{'version'})) + { + $self -> {'default'}{'version'} = + { + type => '', + default => '', + linkage => sub {print $self->{'versionText'}; exit (0) if $versionThenExit;}, + verbose => "print version and exit" + }; + } + + for (keys(%{$self -> {'default'} }) ) + { + my $type = ${$self -> {'default'} }{$_}{'type'}; + push(@{$self -> {'type'} }, "$_$type"); + $self->{'opt'}->{$_} = ${$self -> {'default'} }{$_}{'linkage'} + if ${$self -> {'default'} }{$_}{'linkage'}; + } + + my($result) = &GetOptions($self -> {'opt'}, @{$self -> {'type'} }); + + return $result unless $result; + + for (keys(%{$self -> {'default'} }) ) + { + if (! defined(${$self -> {'opt'} }{$_})) #{ + { + ${$self -> {'opt'} }{$_} = ${$self -> {'default'} }{$_}{'default'}; + } + } + + $result; +} # End of getOptions. + +# -------------------------------------------------------------------------- + +sub helpOptions +{ + my($self) = shift; + my($noHelp) = shift; + $noHelp = 0 unless $noHelp; + my($optwidth, $typewidth, $defaultwidth, $maxlinewidth, $valind, $valwidth) + = (10, 5, 9, 78, 4, 11); + + print "$self->{'helpText'}" if ($self -> {'helpText'}); + + print ' Option', ' ' x ($optwidth - length('Option') -1 ), + 'Type', ' ' x ($typewidth - length('Type') + 1), + 'Default', ' ' x ($defaultwidth - length('Default') ), + "Description\n"; + + for (sort byOrder keys(%{$self -> {'default'} }) ) + { + my($line, $help, $option, $val); + $option = $_; + next if ${$self->{'default'} }{$_}{'noHelp'} && ${$self->{'default'} }{$_}{'noHelp'} > $noHelp; + #$line = " -$_" . ' ' x ($optwidth - (2 + length) ) . + # "${$self->{'default'} }{$_}{'type'} ". + # ' ' x ($typewidth - (1+length(${$self -> {'default'} }{$_}{'type'}) )); + $line = " -$_" . "${$self->{'default'} }{$_}{'type'}". + ' ' x ($typewidth - (1+length(${$self -> {'default'} }{$_}{'type'}) )); + + $val = ${$self->{'default'} }{$_}{'linkage'}; + if ($val) + { + if (ref($val) eq 'SCALAR') + { + $val = $$val; + } + else + { + $val = ''; + } + } + else + { + $val = ${$self->{'default'} }{$_}{'default'}; + } + $line .= "$val "; + $line .= ' ' x ($optwidth + $typewidth + $defaultwidth + 1 - length($line)); + + if (defined(${$self -> {'default'} }{$_}{'verbose'}) && + ${$self -> {'default'} }{$_}{'verbose'} ne '') + { + $help = "${$self->{'default'} }{$_}{'verbose'}"; + } + else + { + $help = ' '; + } + if ((length("$line") + length($help)) < $maxlinewidth) + { + print $line , $help, "\n"; + } + else + { + print $line, "\n", ' ' x $valind, $help, "\n"; + } + for $val (sort byOrder keys(%{${$self->{'default'}}{$option}{'values'}})) + { + print ' ' x ($valind + 2); + print $val, ' ', ' ' x ($valwidth - length($val) - 2); + print ${$self->{'default'}}{$option}{'values'}{$val}, "\n"; + } + } + + print <| ! no argument: variable is set to 1 on -foo (or, to 0 on -nofoo) + =s | :s mandatory (or, optional) string argument + =i | :i mandatory (or, optional) integer argument +EOT +} # End of helpOptions. + +#------------------------------------------------------------------- + +sub new +{ + my($class) = @_; + my($self) = {}; + $self -> {'default'} = {}; + $self -> {'helpText'} = ''; + $self -> {'opt'} = {}; + $opt = $self -> {'opt'}; # An alias for $self -> {'opt'}. + $self -> {'type'} = (); + + return bless $self, $class; + +} # End of new. + +# -------------------------------------------------------------------------- + +1; + +# End MySimple.pm + +require "$ENV{T2H_HOME}/MySimple.pm" + if ($0 =~ /\.pl$/ && + -e "$ENV{T2H_HOME}/MySimple.pm" && -r "$ENV{T2H_HOME}/MySimple.pm"); + +package main; + +#+++############################################################################ +# # +# Constants # +# # +#---############################################################################ + +$DEBUG_TOC = 1; +$DEBUG_INDEX = 2; +$DEBUG_BIB = 4; +$DEBUG_GLOSS = 8; +$DEBUG_DEF = 16; +$DEBUG_HTML = 32; +$DEBUG_USER = 64; +$DEBUG_L2H = 128; + + +$BIBRE = '\[[\w\/-]+\]'; # RE for a bibliography reference +$FILERE = '[\/\w.+-]+'; # RE for a file name +$VARRE = '[^\s\{\}]+'; # RE for a variable name +$NODERE = '[^,:]+'; # RE for a node name +$NODESRE = '[^:]+'; # RE for a list of node names + +$ERROR = "***"; # prefix for errors +$WARN = "**"; # prefix for warnings + + # program home page +$PROTECTTAG = "_ThisIsProtected_"; # tag to recognize protected sections + +$CHAPTEREND = "\n"; # to know where a chpater ends +$SECTIONEND = "\n"; # to know where section ends +$TOPEND = "\n"; # to know where top ends + + + +# +# pre-defined indices +# +$index_properties = +{ + 'c' => { name => 'cp'}, + 'f' => { name => 'fn', code => 1}, + 'v' => { name => 'vr', code => 1}, + 'k' => { name => 'ky', code => 1}, + 'p' => { name => 'pg', code => 1}, + 't' => { name => 'tp', code => 1} +}; + + +%predefined_index = ( + 'cp', 'c', + 'fn', 'f', + 'vr', 'v', + 'ky', 'k', + 'pg', 'p', + 'tp', 't', + ); + +# +# valid indices +# +%valid_index = ( + 'c', 1, + 'f', 1, + 'v', 1, + 'k', 1, + 'p', 1, + 't', 1, + ); + +# +# texinfo section names to level +# +%sec2level = ( + 'top', 0, + 'chapter', 1, + 'unnumbered', 1, + 'majorheading', 1, + 'chapheading', 1, + 'appendix', 1, + 'section', 2, + 'unnumberedsec', 2, + 'heading', 2, + 'appendixsec', 2, + 'appendixsection', 2, + 'subsection', 3, + 'unnumberedsubsec', 3, + 'subheading', 3, + 'appendixsubsec', 3, + 'subsubsection', 4, + 'unnumberedsubsubsec', 4, + 'subsubheading', 4, + 'appendixsubsubsec', 4, + ); + +# +# accent map, TeX command to ISO name +# +%accent_map = ( + '"', 'uml', + '~', 'tilde', + '^', 'circ', + '`', 'grave', + '\'', 'acute', + ); + +# +# texinfo "simple things" (@foo) to HTML ones +# +%simple_map = ( + # cf. makeinfo.c + "*", "
", # HTML+ + " ", " ", + "\t", " ", + "-", "­", # soft hyphen + "\n", " ", + "|", "", + 'tab', '<\/TD>
Button Name Go to From 1.2.3 go to
+EOT + $about .= + ($T2H_ICONS && $T2H_ACTIVE_ICONS{$button} ? + &$T2H_button_icon_img($button, $T2H_ACTIVE_ICONS{$button}) : + " [" . $T2H_NAVIGATION_TEXT{$button} . "] "); + $about .= < + +$button + +$T2H_BUTTONS_GOTO{$button} + +$T2H_BUTTONS_EXAMPLE{$button} +
', + # spacing commands + ":", "", + "!", "!", + "?", "?", + ".", ".", + "-", "", + "/", "", + ); + +# +# texinfo "things" (@foo{}) to HTML ones +# +%things_map = ( + 'TeX', 'TeX', + 'br', '

', # paragraph break + 'bullet', '*', + #'copyright', '(C)', + 'copyright', '©', + 'dots', '...<\/small>', + 'enddots', '....<\/small>', + 'equiv', '==', + 'error', 'error-->', + 'expansion', '==>', + 'minus', '-', + 'point', '-!-', + 'print', '-|', + 'result', '=>', + # APA: &pretty_date requires $MONTH_NAMES and $T2H_LANG + # to be initialized. The latter gets initialized by + # &SetDocumentLanguage in &main. + # We set following hash entry in &main afterwards. + # 'today', &pretty_date, + 'aa', 'å', + 'AA', 'Å', + 'ae', 'æ', + 'oe', 'œ', + 'AE', 'Æ', + 'OE', 'Œ', + 'o', 'ø', + 'O', 'Ø', + 'ss', 'ß', + 'l', '\/l', + 'L', '\/L', + 'exclamdown', '¡', + 'questiondown', '¿', + 'pounds', '£' + ); + +# +# texinfo styles (@foo{bar}) to HTML ones +# +%style_map = ( + 'acronym', 'ACRONYM', + 'asis', '', + 'b', 'B', + 'cite', 'CITE', + 'code', 'CODE', + 'command', 'CODE', + 'ctrl', '&do_ctrl', # special case + 'dfn', 'EM', # DFN tag is illegal in the standard + 'dmn', '', # useless + 'email', '&do_email', # insert a clickable email address + 'emph', 'EM', + 'env', 'CODE', + 'file', '"TT', # will put quotes, cf. &apply_style + 'i', 'I', + 'kbd', 'KBD', + 'key', 'KBD', + 'math', '&do_math', + 'option', '"SAMP', # will put quotes, cf. &apply_style + 'r', '', # unsupported + 'samp', '"SAMP', # will put quotes, cf. &apply_style + 'sc', '&do_sc', # special case + 'strong', 'STRONG', + 't', 'TT', + 'titlefont', '', # useless + 'uref', '&do_uref', # insert a clickable URL + 'url', '&do_url', # insert a clickable URL + 'var', 'VAR', + 'w', '', # unsupported + 'H', '&do_accent', + 'dotaccent', '&do_accent', + 'ringaccent','&do_accent', + 'tieaccent', '&do_accent', + 'u','&do_accent', + 'ubaraccent','&do_accent', + 'udotaccent','&do_accent', + 'v', '&do_accent', + ',', '&do_accent', + 'dotless', '&do_accent' + ); + +# +# texinfo format (@foo/@end foo) to HTML ones +# +%format_map = ( + 'quotation', 'BLOCKQUOTE', + # lists + 'itemize', 'UL', + 'enumerate', 'OL', + # poorly supported + 'flushleft', 'PRE', + 'flushright', 'PRE', + ); + +# +# an eval of these $complex_format_map->{what}->[0] yields beginning +# an eval of these $complex_format_map->{what}->[1] yieleds end +$complex_format_map = +{ + verbatim => + [ + q{"$T2H_EXAMPLE_INDENT_CELL
"},
+  q{'
'} + ], + example => + [ + q{"$T2H_EXAMPLE_INDENT_CELL
"},
+  q{'
'} + ], + smallexample => + [ + q{"$T2H_SMALL_EXAMPLE_INDENT_CELL
"},
+  q{'
'} + ], + display => + [ + q{"$T2H_EXAMPLE_INDENT_CELL
'},
+  q{'
'} + ], + smalldisplay => + [ + q{"$T2H_SMALL_EXAMPLE_INDENT_CELL
'},
+  q{'
'} + ] +}; + +$complex_format_map->{lisp} = $complex_format_map->{example}; +$complex_format_map->{smalllisp} = $complex_format_map->{smallexample}; +$complex_format_map->{format} = $complex_format_map->{display}; +$complex_format_map->{smallformat} = $complex_format_map->{smalldisplay}; + +# +# texinfo definition shortcuts to real ones +# +%def_map = ( + # basic commands + 'deffn', 0, + 'defvr', 0, + 'deftypefn', 0, + 'deftypeop', 0, + 'deftypevr', 0, + 'deftypecv', 0, + 'defcv', 0, + 'defop', 0, + 'deftp', 0, + # basic x commands + 'deffnx', 0, + 'defvrx', 0, + 'deftypefnx', 0, + 'deftypeopx', 0, + 'deftypevrx', 0, + 'deftypecvx', 0, + 'defcvx', 0, + 'defopx', 0, + 'deftpx', 0, + # shortcuts + 'defun', 'deffn Function', + 'defmac', 'deffn Macro', + 'defspec', 'deffn {Special Form}', + 'defvar', 'defvr Variable', + 'defopt', 'defvr {User Option}', + 'deftypefun', 'deftypefn Function', + 'deftypevar', 'deftypevr Variable', + 'defivar', 'defcv {Instance Variable}', + 'deftypeivar', 'defcv {Instance Variable}', # NEW: FIXME + 'defmethod', 'defop Method', + 'deftypemethod', 'defop Method', # NEW:FIXME + # x shortcuts + 'defunx', 'deffnx Function', + 'defmacx', 'deffnx Macro', + 'defspecx', 'deffnx {Special Form}', + 'defvarx', 'defvrx Variable', + 'defoptx', 'defvrx {User Option}', + 'deftypefunx', 'deftypefnx Function', + 'deftypevarx', 'deftypevrx Variable', + 'defivarx', 'defcvx {Instance Variable}', + 'defmethodx', 'defopx Method', + ); + +# +# things to skip +# +%to_skip = ( + # comments + 'c', 1, + 'comment', 1, + 'ifnotinfo', 1, + 'ifnottex', 1, + 'ifhtml', 1, + 'end ifhtml', 1, + 'end ifnotinfo', 1, + 'end ifnottex', 1, + # useless + 'detailmenu', 1, + 'direntry', 1, + 'contents', 1, + 'shortcontents', 1, + 'summarycontents', 1, + 'footnotestyle', 1, + 'end ifclear', 1, + 'end ifset', 1, + 'titlepage', 1, + 'end titlepage', 1, + # unsupported commands (formatting) + 'afourpaper', 1, + 'cropmarks', 1, + 'finalout', 1, + 'headings', 1, + 'sp', 1, + 'need', 1, + 'page', 1, + 'setchapternewpage', 1, + 'everyheading', 1, + 'everyfooting', 1, + 'evenheading', 1, + 'evenfooting', 1, + 'oddheading', 1, + 'oddfooting', 1, + 'smallbook', 1, + 'vskip', 1, + 'filbreak', 1, + 'paragraphindent', 1, + # unsupported formats + 'cartouche', 1, + 'end cartouche', 1, + 'group', 1, + 'end group', 1, + ); + +#+++############################################################################ +# # +# Argument parsing, initialisation # +# # +#---############################################################################ + +# +# flush stdout and stderr after every write +# +select(STDERR); +$| = 1; +select(STDOUT); +$| = 1; + + +%value = (); # hold texinfo variables, see also -D +$use_bibliography = 1; +$use_acc = 1; + +# +# called on -init-file +sub LoadInitFile +{ + my $init_file = shift; + # second argument is value of options + $init_file = shift; + if (-f $init_file) + { + print "# reading initialization file from $init_file\n" + if ($T2H_VERBOSE); + require($init_file); + } + else + { + print "$ERROR Error: can't read init file $int_file\n"; + $init_file = ''; + } +} + +# +# called on -lang +sub SetDocumentLanguage +{ + my $lang = shift; + if (! exists($T2H_WORDS->{$lang})) + { + warn "$ERROR: Language specs for '$lang' do not exists. Reverting to '" . + ($T2H_LANG ? $T2H_LANG : "en") . "'\n"; + } + else + { + print "# using '$lang' as document language\n" if ($T2H_VERBOSE); + $T2H_LANG = $lang; + } +} + +## +## obsolete cmd line options +## +$T2H_OBSOLETE_OPTIONS -> {'no-section_navigation'} = +{ + type => '!', + linkage => sub {$T2H_SECTION_NAVIGATION = 0;}, + verbose => 'obsolete, use -nosec_nav', + noHelp => 2, +}; +$T2H_OBSOLETE_OPTIONS -> {use_acc} = +{ + type => '!', + linkage => \$use_acc, + verbose => 'obsolete', + noHelp => 2 +}; +$T2H_OBSOLETE_OPTIONS -> {expandinfo} = +{ + type => '!', + linkage => sub {$T2H_EXPAND = 'info';}, + verbose => 'obsolete, use "-expand info" instead', + noHelp => 2, +}; +$T2H_OBSOLETE_OPTIONS -> {expandtex} = +{ + type => '!', + linkage => sub {$T2H_EXPAND = 'tex';}, + verbose => 'obsolete, use "-expand tex" instead', + noHelp => 2, +}; +$T2H_OBSOLETE_OPTIONS -> {monolithic} = +{ + type => '!', + linkage => sub {$T2H_SPLIT = '';}, + verbose => 'obsolete, use "-split no" instead', + noHelp => 2 +}; +$T2H_OBSOLETE_OPTIONS -> {split_node} = +{ + type => '!', + linkage => sub{$T2H_SPLIT = 'section';}, + verbose => 'obsolete, use "-split section" instead', + noHelp => 2, +}; +$T2H_OBSOLETE_OPTIONS -> {split_chapter} = +{ + type => '!', + linkage => sub{$T2H_SPLIT = 'chapter';}, + verbose => 'obsolete, use "-split chapter" instead', + noHelp => 2, +}; +$T2H_OBSOLETE_OPTIONS -> {no_verbose} = +{ + type => '!', + linkage => sub {$T2H_VERBOSE = 0;}, + verbose => 'obsolete, use -noverbose instead', + noHelp => 2, +}; +$T2H_OBSOLETE_OPTIONS -> {output_file} = +{ + type => '=s', + linkage => sub {$T2H_OUT = $_[1]; $T2H_SPLIT = '';}, + verbose => 'obsolete, use -out_file instead', + noHelp => 2 +}; + +$T2H_OBSOLETE_OPTIONS -> {section_navigation} = +{ + type => '!', + linkage => \$T2H_SECTION_NAVIGATION, + verbose => 'obsolete, use -sec_nav instead', + noHelp => 2, +}; + +$T2H_OBSOLETE_OPTIONS -> {verbose} = +{ + type => '!', + linkage => \$T2H_VERBOSE, + verbose => 'obsolete, use -Verbose instead', + noHelp => 2 +}; + +# read initialzation from $sysconfdir/texi2htmlrc or $HOME/.texi2htmlrc +my $home = $ENV{HOME}; +defined($home) or $home = ''; +foreach $i ('/etc/texi2htmlrc', "$home/.texi2htmlrc") +{ + if (-f $i) + { + print "# reading initialization file from $i\n" + if ($T2H_VERBOSE); + require($i); + } +} + + +#+++############################################################################ +# # +# parse command-line options +# # +#---############################################################################ +$T2H_USAGE_TEXT = <getOptions($T2H_OPTIONS, $T2H_USAGE_TEXT, "$THISVERSION\n")) +{ + print $Configure_failed if $Configure_failed; + die $T2H_FAILURE_TEXT; +} + +if (@ARGV > 1) +{ + eval {Getopt::Long::Configure("no_pass_through");}; + if (! $options->getOptions($T2H_OBSOLETE_OPTIONS, $T2H_USAGE_TEXT, "$THISVERSION\n")) + { + print $Configure_failed if $Configure_failed; + die $T2H_FAILURE_TEXT; + } +} + +if ($T2H_CHECK) +{ + die "Need file to check\n$T2H_FAILURE_TEXT" unless @ARGV > 0; + ✓ + exit; +} + +#+++############################################################################ +# # +# evaluation of cmd line options +# # +#---############################################################################ + +if ($T2H_EXPAND eq 'info') +{ + $to_skip{'ifinfo'} = 1; + $to_skip{'end ifinfo'} = 1; +} +elsif ($T2H_EXPAND eq 'tex') +{ + $to_skip{'iftex'} = 1; + $to_skip{'end iftex'} = 1; + +} + +$T2H_INVISIBLE_MARK = '' if $T2H_INVISIBLE_MARK eq 'xbm'; + +# +# file name buisness +# +die "Need exactly one file to translate\n$T2H_FAILURE_TEXT" unless @ARGV == 1; +$docu = shift(@ARGV); +if ($docu =~ /.*\//) +{ + chop($docu_dir = $&); + $docu_name = $'; +} +else +{ + $docu_dir = '.'; + $docu_name = $docu; +} +unshift(@T2H_INCLUDE_DIRS, $docu_dir); +$docu_name =~ s/\.te?x(i|info)?$//; # basename of the document +$docu_name = $T2H_PREFIX if ($T2H_PREFIX); + +# subdir +if ($T2H_SUBDIR && ! $T2H_OUT) +{ + $T2H_SUBDIR =~ s|/*$||; + unless (-d "$T2H_SUBDIR" && -w "$T2H_SUBDIR") + { + if ( mkdir($T2H_SUBDIR, oct(755))) + { + print "# created directory $T2H_SUBDIR\n" if ($T2H_VERBOSE); + } + else + { + warn "$ERROR can't create directory $T2H_SUBDIR. Put results into current directory\n"; + $T2H_SUBDIR = ''; + } + } +} + +if ($T2H_SUBDIR && ! $T2H_OUT) +{ + $docu_rdir = "$T2H_SUBDIR/"; + print "# putting result files into directory $docu_rdir\n" if ($T2H_VERBOSE); +} +else +{ + if ($T2H_OUT && $T2H_OUT =~ m|(.*)/|) + { + $docu_rdir = "$1/"; + print "# putting result files into directory $docu_rdir\n" if ($T2H_VERBOSE); + } + else + { + print "# putting result files into current directory \n" if ($T2H_VERBOSE); + $docu_rdir = ''; + } +} + +# extension +if ($T2H_SHORTEXTN) +{ + $docu_ext = "htm"; +} +else +{ + $docu_ext = "html"; +} +if ($T2H_TOP_FILE =~ /\..*$/) +{ + $T2H_TOP_FILE = $`.".$docu_ext"; +} + +# result files +if (! $T2H_OUT && ($T2H_SPLIT =~ /section/i || $T2H_SPLIT =~ /node/i)) +{ + $T2H_SPLIT = 'section'; +} +elsif (! $T2H_OUT && $T2H_SPLIT =~ /chapter/i) +{ + $T2H_SPLIT = 'chapter' +} +else +{ + undef $T2H_SPLIT; +} + +$docu_doc = "$docu_name.$docu_ext"; # document's contents +$docu_doc_file = "$docu_rdir$docu_doc"; +if ($T2H_SPLIT) +{ + $docu_toc = $T2H_TOC_FILE || "${docu_name}_toc.$docu_ext"; # document's table of contents + $docu_stoc = "${docu_name}_ovr.$docu_ext"; # document's short toc + $docu_foot = "${docu_name}_fot.$docu_ext"; # document's footnotes + $docu_about = "${docu_name}_abt.$docu_ext"; # about this document + $docu_top = $T2H_TOP_FILE || $docu_doc; +} +else +{ + if ($T2H_OUT) + { + $docu_doc = $T2H_OUT; + $docu_doc =~ s|.*/||; + } + $docu_toc = $docu_foot = $docu_stoc = $docu_about = $docu_top = $docu_doc; +} + +$docu_toc_file = "$docu_rdir$docu_toc"; +$docu_stoc_file = "$docu_rdir$docu_stoc"; +$docu_foot_file = "$docu_rdir$docu_foot"; +$docu_about_file = "$docu_rdir$docu_about"; +$docu_top_file = "$docu_rdir$docu_top"; + +$docu_frame_file = "$docu_rdir${docu_name}_frame.$docu_ext"; +$docu_toc_frame_file = "$docu_rdir${docu_name}_toc_frame.$docu_ext"; + +# +# variables +# +$value{'html'} = 1; # predefine html (the output format) +$value{'texi2html'} = $THISVERSION; # predefine texi2html (the translator) +# _foo: internal to track @foo +foreach ('_author', '_title', '_subtitle', + '_settitle', '_setfilename', '_shorttitle') +{ + $value{$_} = ''; # prevent -w warnings +} +%node2sec = (); # node to section name +%sec2node = (); # section to node name +%sec2seccount = (); # section to section count +%seccount2sec = (); # section count to section +%sec2number = (); # section to number + # $number =~ ^[\dA-Z]+\.(\d+(\.\d+)*)?$ +%number2sec = (); # number to section +%idx2node = (); # index keys to node +%node2href = (); # node to HREF +%node2next = (); # node to next +%node2prev = (); # node to prev +%node2up = (); # node to up +%bib2href = (); # bibliography reference to HREF +%gloss2href = (); # glossary term to HREF +@sections = (); # list of sections +%tag2pro = (); # protected sections + +# +# initial indexes +# +$bib_num = 0; +$foot_num = 0; +$gloss_num = 0; +$idx_num = 0; +$sec_num = 0; +$doc_num = 0; +$html_num = 0; + +# +# can I use ISO8859 characters? (HTML+) +# +if ($T2H_USE_ISO) +{ + $things_map{'bullet'} = "•"; + $things_map{'copyright'} = "©"; + $things_map{'dots'} = "…"; + $things_map{'equiv'} = "≡"; + $things_map{'expansion'} = "→"; + $things_map{'point'} = "∗"; + $things_map{'result'} = "⇒"; +} + +# +# read texi2html extensions (if any) +# +$extensions = 'texi2html.ext'; # extensions in working directory +if (-f $extensions) +{ + print "# reading extensions from $extensions\n" if $T2H_VERBOSE; + require($extensions); +} +($progdir = $0) =~ s/[^\/]+$//; +if ($progdir && ($progdir ne './')) +{ + $extensions = "${progdir}texi2html.ext"; # extensions in texi2html directory + if (-f $extensions) + { + print "# reading extensions from $extensions\n" if $T2H_VERBOSE; + require($extensions); + } +} + + +print "# reading from $docu\n" if $T2H_VERBOSE; + +######################################################################### +# +# latex2html stuff +# +# latex2html conversions consist of three stages: +# 1) ToLatex: Put "latex" code into a latex file +# 2) ToHtml: Use latex2html to generate corresponding html code and images +# 3) FromHtml: Extract generated code and images from latex2html run +# + +########################## +# default settings +# + +# defaults for files and names + +sub l2h_Init +{ + local($root) = @_; + return 0 unless ($root); + $l2h_name = "${root}_l2h"; + $l2h_latex_file = "$docu_rdir${l2h_name}.tex"; + $l2h_cache_file = "${docu_rdir}l2h_cache.pm"; + $T2H_L2H_L2H = "latex2html" unless ($T2H_L2H_L2H); + # destination dir -- generated images are put there, should be the same + # as dir of enclosing html document -- + $l2h_html_file = "$docu_rdir${l2h_name}.html"; + $l2h_prefix = "${l2h_name}_"; + return 1; +} + + +########################## +# +# First stage: Generation of Latex file +# Initialize with: l2h_InitToLatex +# Add content with: l2h_ToLatex($text) --> HTML placeholder comment +# Finish with: l2h_FinishToLatex +# + +$l2h_latex_preample = <$l2h_latex_file")) + { + warn "$ERROR Error l2h: Can't open latex file '$latex_file' for writing\n"; + return 0; + } + print "# l2h: use ${l2h_latex_file} as latex file\n" if ($T2H_VERBOSE); + print L2H_LATEX $l2h_latex_preample; + } + # open database for caching + l2h_InitCache(); + $l2h_latex_count = 0; + $l2h_to_latex_count = 0; + $l2h_cached_count = 0; + return 1; +} + +# print text (1st arg) into latex file (if not already there), return +# HTML commentary which can be later on replaced by the latex2html +# generated text +sub l2h_ToLatex +{ + my($text) = @_; + my($count); + $l2h_to_latex_count++; + $text =~ s/(\s*)$//; + # try whether we can cache it + my $cached_text = l2h_FromCache($text); + if ($cached_text) + { + $l2h_cached_count++; + return $cached_text; + } + # try whether we have text already on things to do + unless ($count = $l2h_to_latex{$text}) + { + $count = $l2h_latex_count; + $l2h_latex_count++; + $l2h_to_latex{$text} = $count; + $l2h_to_latex[$count] = $text; + unless ($T2H_L2H_SKIP) + { + print L2H_LATEX "\\begin{rawhtml}\n"; + print L2H_LATEX "\n"; + print L2H_LATEX "\\end{rawhtml}\n"; + + print L2H_LATEX "$text\n"; + + print L2H_LATEX "\\begin{rawhtml}\n"; + print L2H_LATEX "\n"; + print L2H_LATEX "\\end{rawhtml}\n"; + } + } + return ""; +} + +# print closing into latex file and close it +sub l2h_FinishToLatex +{ + local ($reused); + $reused = $l2h_to_latex_count - $l2h_latex_count - $l2h_cached_count; + unless ($T2H_L2H_SKIP) + { + print L2H_LATEX $l2h_latex_closing; + close(L2H_LATEX); + } + print "# l2h: finished to latex ($l2h_cached_count cached, $reused reused, $l2h_latex_count contents)\n" if ($T2H_VERBOSE); + unless ($l2h_latex_count) + { + l2h_Finish(); + return 0; + } + return 1; +} + +################################### +# Second stage: Use latex2html to generate corresponding html code and images +# +# l2h_ToHtml([$l2h_latex_file, [$l2h_html_dir]]): +# Call latex2html on $l2h_latex_file +# Put images (prefixed with $l2h_name."_") and html file(s) in $l2h_html_dir +# Return 1, on success +# 0, otherwise +# +sub l2h_ToHtml +{ + local($call, $ext, $root, $dotbug); + if ($T2H_L2H_SKIP) + { + print "# l2h: skipping latex2html run\n" if ($T2H_VERBOSE); + return 1; + } + # Check for dot in directory where dvips will work + if ($T2H_L2H_TMP) + { + if ($T2H_L2H_TMP =~ /\./) + { + warn "$ERROR Warning l2h: l2h_tmp dir contains a dot. Use /tmp, instead\n"; + $dotbug = 1; + } + } + else + { + if (&getcwd =~ /\./) + { + warn "$ERROR Warning l2h: current dir contains a dot. Use /tmp as l2h_tmp dir \n"; + $dotbug = 1; + } + } + # fix it, if necessary and hope that it works + $T2H_L2H_TMP = "/tmp" if ($dotbug); + + $call = $T2H_L2H_L2H; + # use init file, if specified + $call = $call . " -init_file " . $init_file if ($init_file && -f $init_file); + # set output dir + $call .= ($docu_rdir ? " -dir $docu_rdir" : " -no_subdir"); + # use l2h_tmp, if specified + $call = $call . " -tmp $T2H_L2H_TMP" if ($T2H_L2H_TMP); + # options we want to be sure of + $call = $call ." -address 0 -info 0 -split 0 -no_navigation -no_auto_link"; + $call = $call ." -prefix ${l2h_prefix} $l2h_latex_file"; + + print "# l2h: executing '$call'\n" if ($T2H_VERBOSE); + if (system($call)) + { + warn "l2h ***Error: '${call}' did not succeed\n"; + return 0; + } + else + { + print "# l2h: latex2html finished successfully\n" if ($T2H_VERBOSE); + return 1; + } +} + +# this is directly pasted over from latex2html +sub getcwd +{ + local($_) = `pwd`; + + die "'pwd' failed (out of memory?)\n" + unless length; + chop; + $_; +} + + +########################## +# Third stage: Extract generated contents from latex2html run +# Initialize with: l2h_InitFromHtml +# open $l2h_html_file for reading +# reads in contents into array indexed by numbers +# return 1, on success -- 0, otherwise +# Extract Html code with: l2h_FromHtml($text) +# replaces in $text all previosuly inserted comments by generated html code +# returns (possibly changed) $text +# Finish with: l2h_FinishFromHtml +# closes $l2h_html_dir/$l2h_name.".$docu_ext" + +sub l2h_InitFromHtml +{ + local($h_line, $h_content, $count, %l2h_img); + + if (! open(L2H_HTML, "<${l2h_html_file}")) + { + print "$ERROR Error l2h: Can't open ${l2h_html_file} for reading\n"; + return 0; + } + print "# l2h: use ${l2h_html_file} as html file\n" if ($T2H_VERBOSE); + + $l2h_html_count = 0; + while ($h_line = ) + { + if ($h_line =~ /^/) + { + $count = $1; + $h_content = ""; + while ($h_line = ) + { + if ($h_line =~ /^/) + { + chomp $h_content; + chomp $h_content; + $l2h_html_count++; + $h_content = l2h_ToCache($count, $h_content); + $l2h_from_html[$count] = $h_content; + $h_content = ''; + last; + } + $h_content = $h_content.$h_line; + } + if ($hcontent) + { + print "$ERROR Warning l2h: l2h_end $l2h_name $count not found\n" + if ($T2H_VERBOSE); + close(L2H_HTML); + return 0; + } + } + } + print "# l2h: Got $l2h_html_count of $l2h_latex_count html contents\n" + if ($T2H_VERBOSE); + + close(L2H_HTML); + return 1; +} + +sub l2h_FromHtml +{ + my($text) = @_; + my($done, $to_do, $count); + $to_do = $text; + while ($to_do =~ /([^\000]*)([^\000]*)/) + { + $to_do = $1; + $count = $2; + $done = $3.$done; + $done = "".$done + if ($T2H_DEBUG & $DEBUG_L2H); + + $done = &l2h_ExtractFromHtml($count) . $done; + + $done = "".$done + if ($T2H_DEBUG & $DEBUG_L2H); + } + return $to_do.$done; +} + + +sub l2h_ExtractFromHtml +{ + local($count) = @_; + return $l2h_from_html[$count] if ($l2h_from_html[$count]); + if ($count >= 0 && $count < $l2h_latex_count) + { + # now we are in trouble + local($l_l2h, $_); + + $l2h_extract_error++; + print "$ERROR l2h: can't extract content $count from html\n" + if ($T2H_VERBOSE); + # try simple (ordinary) substition (without l2h) + $l_l2h = $T2H_L2H; + $T2H_L2H = 0; + $_ = $l2h_to_latex{$count}; + $_ = &substitute_style($_); + &unprotect_texi; + $_ = "" . $_ + if ($T2H_DEBUG & $DEBUG_L2H); + $T2H_L2H = $l_l2h; + return $_; + } + else + { + # now we have been incorrectly called + $l2h_range_error++; + print "$ERROR l2h: Request of $count content which is out of valide range [0,$l2h_latex_count)\n"; + return "" + if ($T2H_DEBUG & $DEBUG_L2H); + return ""; + } +} + +sub l2h_FinishFromHtml +{ + if ($T2H_VERBOSE) + { + if ($l2h_extract_error + $l2h_range_error) + { + print "# l2h: finished from html ($l2h_extract_error extract and $l2h_range_error errors)\n"; + } + else + { + print "# l2h: finished from html (no errors)\n"; + } + } +} + +sub l2h_Finish +{ + l2h_StoreCache(); + if ($T2H_L2H_CLEAN) + { + print "# l2h: removing temporary files generated by l2h extension\n" + if $T2H_VERBOSE; + while (<"$docu_rdir$l2h_name"*>) + { + unlink $_; + } + } + print "# l2h: Finished\n" if $T2H_VERBOSE; + return 1; +} + +############################## +# stuff for l2h caching +# + +# I tried doing this with a dbm data base, but it did not store all +# keys/values. Hence, I did as latex2html does it +sub l2h_InitCache +{ + if (-r "$l2h_cache_file") + { + my $rdo = do "$l2h_cache_file"; + warn("$ERROR l2h Error: could not load $docu_rdir$l2h_cache_file: $@\n") + unless ($rdo); + } +} + +sub l2h_StoreCache +{ + return unless $l2h_latex_count; + my ($key, $value); + open(FH, ">$l2h_cache_file") || return warn"$ERROR l2h Error: could not open $docu_rdir$l2h_cache_file for writing: $!\n"; + while (($key, $value) = each %l2h_cache) + { + # escape stuff + $key =~ s|/|\\/|g; + $key =~ s|\\\\/|\\/|g; + # weird, a \ at the end of the key results in an error + # maybe this also broke the dbm database stuff + $key =~ s|\\$|\\\\|; + $value =~ s/\|/\\\|/go; + $value =~ s/\\\\\|/\\\|/go; + $value =~ s|\\\\|\\\\\\\\|g; + print FH "\n\$l2h_cache_key = q/$key/;\n"; + print FH "\$l2h_cache{\$l2h_cache_key} = q|$value|;\n"; + } + print FH "1;"; + close(FH); +} + +# return cached html, if it exists for text, and if all pictures +# are there, as well +sub l2h_FromCache +{ + my $text = shift; + my $cached = $l2h_cache{$text}; + if ($cached) + { + while ($cached =~ m/SRC="(.*?)"/g) + { + unless (-e "$docu_rdir$1") + { + return undef; + } + } + return $cached; + } + return undef; +} + +# insert generated html into cache, move away images, +# return transformed html +$maximage = 1; +sub l2h_ToCache +{ + my $count = shift; + my $content = shift; + my @images = ($content =~ /SRC="(.*?)"/g); + my ($src, $dest); + + for $src (@images) + { + $dest = $l2h_img{$src}; + unless ($dest) + { + my $ext; + if ($src =~ /.*\.(.*)$/ && $1 ne $docu_ext) + { + $ext = $1; + } + else + { + warn "$ERROR: L2h image $src has invalid extension\n"; + next; + } + while (-e "$docu_rdir${docu_name}_$maximage.$ext") + { + $maximage++; + } + $dest = "${docu_name}_$maximage.$ext"; + system("cp -f $docu_rdir$src $docu_rdir$dest"); + $l2h_img{$src} = $dest; + unlink "$docu_rdir$src" unless ($DEBUG & $DEBUG_L2H); + } + $content =~ s/$src/$dest/g; + } + $l2h_cache{$l2h_to_latex[$count]} = $content; + return $content; +} + + +#+++############################################################################ +# # +# Pass 1: read source, handle command, variable, simple substitution # +# # +#---############################################################################ +sub pass1 +{ + my $name; + my $line; + @lines = (); # whole document + @toc_lines = (); # table of contents + @stoc_lines = (); # table of contents + $curlevel = 0; # current level in TOC + $node = ''; # current node name + $node_next = ''; # current node next name + $node_prev = ''; # current node prev name + $node_up = ''; # current node up name + $in_table = 0; # am I inside a table + $table_type = ''; # type of table ('', 'f', 'v', 'multi') + @tables = (); # nested table support + $in_bibliography = 0; # am I inside a bibliography + $in_glossary = 0; # am I inside a glossary + $in_top = 0; # am I inside the top node + $has_top = 0; # did I see a top node? + $has_top_command = 0; # did I see @top for automatic pointers? + $in_pre = 0; # am I inside a preformatted section + $in_list = 0; # am I inside a list + $in_html = 0; # am I inside an HTML section + $first_line = 1; # is it the first line + $dont_html = 0; # don't protect HTML on this line + $deferred_ref = ''; # deferred reference for indexes + @html_stack = (); # HTML elements stack + $html_element = ''; # current HTML element + &html_reset; + %macros = (); # macros + $toc_indent = # used for identation in TOC's + ($T2H_NUMBER_SECTIONS ? 'BLOCKQUOTE' : 'UL'); + + # init l2h + $T2H_L2H = &l2h_Init($docu_name) if ($T2H_L2H); + $T2H_L2H = &l2h_InitToLatex if ($T2H_L2H); + + # build code for simple substitutions + # the maps used (%simple_map and %things_map) MUST be aware of this + # watch out for regexps, / and escaped characters! + $subst_code = ''; + foreach (keys(%simple_map)) + { + ($re = $_) =~ s/(\W)/\\$1/g; # protect regexp chars + $subst_code .= "s/\\\@$re/$simple_map{$_}/g;\n"; + } + foreach (keys(%things_map)) + { + $subst_code .= "s/\\\@$_\\{\\}/$things_map{$_}/g;\n"; + } + if ($use_acc) + { + # accentuated characters + foreach (keys(%accent_map)) + { + if ($_ eq "`") + { + $subst_code .= "s/$;3"; + } + elsif ($_ eq "'") + { + $subst_code .= "s/$;4"; + } + else + { + $subst_code .= "s/\\\@\\$_"; + } + $subst_code .= "([a-z])/&\${1}$accent_map{$_};/gi;\n"; + } + } + eval("sub simple_substitutions { $subst_code }"); + + &init_input; + INPUT_LINE: while ($_ = &next_line) + { + # + # remove \input on the first lines only + # + if ($first_line) + { + next if /^\\input/; + $first_line = 0; + } + # non-@ substitutions cf. texinfmt.el + # + # parse texinfo tags + # + $tag = ''; + $end_tag = ''; + if (/^\s*\@end\s+(\w+)\b/) + { + $end_tag = $1; + } + elsif (/^\s*\@(\w+)\b/) + { + $tag = $1; + } + # + # handle @html / @end html + # + if ($in_html) + { + if ($end_tag eq 'html') + { + $in_html = 0; + } + else + { + $tag2pro{$in_html} .= $_; + } + next; + } + elsif ($tag eq 'html') + { + $in_html = $PROTECTTAG . ++$html_num; + push(@lines, $in_html); + next; + } + + # + # try to remove inlined comments + # syntax from tex-mode.el comment-start-skip + # + s/((^|[^\@])(\@\@)*)\@(c( |\{)|comment ).*$/$1/; + + # Sometimes I use @c right at the end of a line ( to suppress the line feed ) + # s/((^|[^\@])(\@\@)*)\@c(omment)?$/$1/; + # s/((^|[^\@])(\@\@)*)\@c(omment)? .*/$1/; + # s/(.*)\@c{.*?}(.*)/$1$2/; + # s/(.*)\@comment{.*?}(.*)/$1$2/; + # s/^(.*)\@c /$1/; + # s/^(.*)\@comment /$1/; + + ############################################################# + # value substitution before macro expansion, so that + # it works in macro arguments + s/\@value\{($VARRE)\}/$value{$1}/eg; + + ############################################################# + # macro substitution + while (/\@(\w+)/g) + { + if (exists($macros->{$1})) + { + my $before = $`; + $name = $1; + my $after = $'; + my @args; + my $args; + ##################################################### + # Support for multi-line macro invocations and nested + # '{' and '}' within macro invocations added by + # Eric Sunshine 2000/09/10. + ##################################################### + if ($after =~ /^\s*\{/) # Macro arguments delimited by '{' and '}'? + { + my ($protect, $start, $end, $depth, $c) = (0, 0, 0, 0, 0); + foreach $c (unpack('C*', $after)) + { + if ($protect) + { # Character protected by '\' or '@'; pass through unmolested. + $protect = 0; + } + elsif ($c == ord('\\') || $c == ord('@')) + { # '\' and '@' remove special meaning of next character. + $protect = 1; + } + elsif ($c == ord('{')) # Allow '{' and '}' to nest. + { + $depth++; + } + elsif ($c == ord('}')) + { + $depth--; + last if $depth == 0; + } + $start++ if !$depth; # Position of opening brace. + $end++; # Position of closing brace. + } + + # '{' & '}' did not completely unnest; append next line; try again. + if ($depth > 0) + { + my $paste = &next_line; + die "$ERROR Missing closing brace '}' for invocation of macro " . + "\"\@$name\" on line:\n", substr($_,0,70), "...\n" unless $paste; + s/\n$/ /; + unshift @input_spool, $_ . $paste; + next INPUT_LINE; + } + + # Extract macro arguments from within '{' and '}'. + $len = $end - $start - 1; + $args = ($len > 0) ? substr($after, $start + 1, $len) : ''; + $after = substr($after, $end + 1); + } + ############ End Sunshine Modifications ############# + elsif (@{$macros->{$name}->{Args}} == 1) # Macro arg extends to EOL. + { + $args = $after; + $args =~ s/^\s*//; + $args =~ s/\s*$//; + $after = ''; + } + $args =~ s|\\\\|\\|g; + $args =~ s|\\\{|\{|g; + $args =~ s|\\\}|\}|g; + if (@{$macros->{$name}->{Args}} > 1) + { + $args =~ s/(^|[^\\]),/$1$;/g ; + $args =~ s|\\,|,|g; + @args = split(/$;\s*/, $args) if (@{$macros->{$name}->{Args}} > 1); + } + else + { + $args =~ s|\\,|,|g; + @args = ($args); + } + my $macrobody = $macros->{$name}->{Body}; + for ($i=0; $i<=$#args; $i++) + { + $macrobody =~ s|\\$macros->{$name}->{Args}->[$i]\\|$args[$i]|g; + } + $macrobody =~ s|\\\\|\\|g; + $_ = $before . $macrobody . $after; + unshift @input_spool, map {$_ = $_."\n"} split(/\n/, $_); + next INPUT_LINE; + } + } + # + # try to skip the line + # + if ($end_tag) + { + $in_titlepage = 0 if $end_tag eq 'titlepage'; + next if $to_skip{"end $end_tag"}; + } + elsif ($tag) + { + $in_titlepage = 1 if $tag eq 'titlepage'; + next if $to_skip{$tag}; + last if $tag eq 'bye'; + } + if ($in_top) + { + # parsing the top node + if ($tag eq 'node' || + ($sec2level{$tag} && $tag !~ /unnumbered/ && $tag !~ /heading/)) + { + # no more in top + $in_top = 0; + push(@lines, $TOPEND); + } + } + unless ($in_pre) + { + s/``/\"/go; + s/''/\"/go; + s/([\w ])---([\w ])/$1--$2/g; + } + # + # analyze the tag + # + if ($tag) + { + # skip lines + &skip_until($tag), next if $tag eq 'ignore'; + &skip_until($tag), next if $tag eq 'ifnothtml'; + if ($tag eq 'ifinfo') + { + &skip_until($tag), next unless $T2H_EXPAND eq 'info'; + } + if ($tag eq 'iftex') + { + &skip_until($tag), next unless $T2H_EXPAND eq 'tex'; + } + if ($tag eq 'tex') + { + # add to latex2html file + if ($T2H_EXPAND eq 'tex' && $T2H_L2H && ! $in_pre) + { + # add space to the end -- tex(i2dvi) does this, as well + push(@lines, &l2h_ToLatex(&string_until($tag) . " ")); + } + else + { + &skip_until($tag); + } + next; + } + if ($tag eq 'titlepage') + { + next; + } + # handle special tables + if ($tag =~ /^(|f|v|multi)table$/) + { + $table_type = $1; + $tag = 'table'; + } + # special cases + # APA: Fixed regexp to ONLY match the top node, not any + # node starting with the word top. + if ($tag eq 'top' || ($tag eq 'node' && /^\@node\s+top\s*(,.*)?$/i)) + { + $in_top = 1; + $has_top = 1; + $has_top_command = 1 if $tag eq 'top'; + @lines = (); # ignore all lines before top (title page garbage) + next; + } + elsif ($tag eq 'node') + { + if ($in_top) + { + $in_top = 0; + push(@lines, $TOPEND); + } + warn "$ERROR Bad node line: $_" unless $_ =~ /^\@node\s$NODESRE$/o; + # request of "Richard Y. Kim" + s/^\@node\s+//; + $_ = &protect_html($_); # if node contains '&' for instance + ($node, $node_next, $node_prev, $node_up) = split(/,/); + if ($node) + { + &normalise_node($node); + } + else + { + warn "$ERROR Node is undefined: $_ (eg. \@node NODE-NAME, NEXT, PREVIOUS, UP)"; + } + if ($node_next) + { + &normalise_node($node_next); + } + if ($node_prev) + { + &normalise_node($node_prev); + } + if ($node_up) + { + &normalise_node($node_up); + } + $node =~ /\"/ ? + push @lines, &html_debug("\n", __LINE__) : + push @lines, &html_debug("\n", __LINE__); + next; + } + elsif ($tag eq 'include') + { + if (/^\@include\s+($FILERE)\s*$/o) + { + $file = LocateIncludeFile($1); + if ($file && -e $file) + { + &open($file); + print "# including $file\n" if $T2H_VERBOSE; + } + else + { + warn "$ERROR Can't find $1, skipping"; + } + } + else + { + warn "$ERROR Bad include line: $_"; + } + next; + } + elsif ($tag eq 'ifclear') + { + if (/^\@ifclear\s+($VARRE)\s*$/o) + { + next unless defined($value{$1}); + &skip_until($tag); + } + else + { + warn "$ERROR Bad ifclear line: $_"; + } + next; + } + elsif ($tag eq 'ifset') + { + if (/^\@ifset\s+($VARRE)\s*$/o) + { + next if defined($value{$1}); + &skip_until($tag); + } + else + { + warn "$ERROR Bad ifset line: $_"; + } + next; + } + elsif ($tag eq 'menu') + { + unless ($T2H_SHOW_MENU) + { + &skip_until($tag); + next; + } + &html_push_if($tag); + push(@lines, &html_debug('', __LINE__)); + } + elsif ($format_map{$tag}) + { + $in_pre = 1 if $format_map{$tag} eq 'PRE'; + &html_push_if($format_map{$tag}); + push(@lines, &html_debug('', __LINE__)); + $in_list++ if $format_map{$tag} eq 'UL' || $format_map{$tag} eq 'OL' ; + # push(@lines, &debug("

\n", __LINE__)) + # if $tag =~ /example/i; + # Eric Sunshine :
blah
looks + # better than
\nblah
on OmniWeb2 NextStep browser. + push(@lines, &debug("<$format_map{$tag}>" . + ($in_pre ? '' : "\n"), __LINE__)); + next; + } + elsif (exists $complex_format_map->{$tag}) + { + my $start = eval $complex_format_map->{$tag}->[0]; + # APA: implicitly ends paragraph, so let's do it + # explicitly to keep our HTML stack in sync. + if ($start =~ /\A\s*
/i) + { + if ($html_element eq 'P') + { + push (@lines2, &debug("

\n", __LINE__)); + &html_pop(); + } + } + if ($@) + { + print "$ERROR: eval of complex_format_map->{$tag}->[0] $complex_format_map->{$tag}->[0]: $@"; + $start = '
'
+                }
+                $in_pre = 1 if $start =~ /
 implicitly ends paragraph, so let's
+                        # do it explicitly to keep our HTML stack in sync.
+                        if ($html_element eq 'P')
+                        {
+                            push (@lines, &debug("

\n", __LINE__)); + &html_pop(); + } + # don't use borders -- gets confused by empty cells + push(@lines, &debug("
\n", __LINE__)); + &html_push_if('TABLE'); + } + else + { + # APA:
implicitly ends paragraph, so let's + # do it explicitly to keep our HTML stack in sync. + if ($html_element eq 'P') + { + push (@lines, &debug("

\n", __LINE__)); + &html_pop(); + } + push(@lines, &debug("
\n", __LINE__)); + &html_push_if('DL'); + } + push(@lines, &html_debug('', __LINE__)); + } + else + { + warn "$ERROR Bad table line: $_"; + } + next; + } + elsif ($tag eq 'synindex' || $tag eq 'syncodeindex') + { + if (/^\@$tag\s+(\w+)\s+(\w+)\s*$/) + { + my $from = $1; + my $to = $2; + my $prefix_from = IndexName2Prefix($from); + my $prefix_to = IndexName2Prefix($to); + + warn("$ERROR unknown from index name $from ind syn*index line: $_"), next + unless $prefix_from; + warn("$ERROR unknown to index name $to ind syn*index line: $_"), next + unless $prefix_to; + + if ($tag eq 'syncodeindex') + { + $index_properties->{$prefix_to}->{'from_code'}->{$prefix_from} = 1; + } + else + { + $index_properties->{$prefix_to}->{'from'}->{$prefix_from} = 1; + } + } + else + { + warn "$ERROR Bad syn*index line: $_"; + } + next; + } + elsif ($tag eq 'defindex' || $tag eq 'defcodeindex') + { + if (/^\@$tag\s+(\w+)\s*$/) + { + $name = $1; + $index_properties->{$name}->{name} = $name; + $index_properties->{$name}->{code} = 1 if $tag eq 'defcodeindex'; + } + else + { + warn "$ERROR Bad defindex line: $_"; + } + next; + } + elsif (/^\@printindex/) + { + # APA: HTML generated for @printindex contains
+ # which implicitly ends paragraph, so let's do it + # explicitly to keep our HTML stack in sync. + if ($html_element eq 'P') + { + push(@lines, &debug("

\n", __LINE__)); + &html_pop(); + } + push (@lines, "$_"); + next; + } + elsif ($tag eq 'sp') + { + push(@lines, &debug("

\n", __LINE__)); + next; + } + elsif ($tag eq 'center') + { + push(@lines, &debug("
\n", __LINE__)); + s/\@center//; + } + elsif ($tag eq 'setref') + { + my ($setref); + &protect_html; # if setref contains '&' for instance + if (/^\@$tag\s*{($NODERE)}\s*$/) + { + $setref = $1; + $setref =~ s/\s+/ /go; # normalize + $setref =~ s/ $//; + $node2sec{$setref} = $name; + $sec2node{$name} = $setref; + $node2href{$setref} = "$docu_doc#$docid"; + } + else + { + warn "$ERROR Bad setref line: $_"; + } + next; + } + elsif ($tag eq 'lowersections') + { + my ($sec, $level); + while (($sec, $level) = each %sec2level) + { + $sec2level{$sec} = $level + 1; + } + next; + } + elsif ($tag eq 'raisesections') + { + my ($sec, $level); + while (($sec, $level) = each %sec2level) + { + $sec2level{$sec} = $level - 1; + } + next; + } + elsif ($tag eq 'macro' || $tag eq 'rmacro') + { + if (/^\@$tag\s*(\w+)\s*(.*)/) + { + $name = $1; + my @args; + @args = split(/\s*,\s*/ , $1) + if ($2 =~ /^\s*{(.*)}\s*/); + + $macros->{$name}->{Args} = \@args; + $macros->{$name}->{Body} = ''; + while (($_ = &next_line) && $_ !~ /\@end $tag/) + { + $macros->{$name}->{Body} .= $_; + } + die "ERROR: No closing '\@end $tag' found for macro definition of '$name'\n" + unless (/\@end $tag/); + chomp $macros->{$name}->{Body}; + } + else + { + warn "$ERROR: Bad macro defintion $_" + } + next; + } + elsif ($tag eq 'unmacro') + { + delete $macros->{$1} if (/^\@unmacro\s*(\w+)/); + next; + } + elsif ($tag eq 'documentlanguage') + { + SetDocumentLanguage($1) if (!$T2H_LANG && /documentlanguage\s*(\w+)/); + } + elsif (defined($def_map{$tag})) + { + if ($def_map{$tag}) + { + s/^\@$tag\s+//; + $tag = $def_map{$tag}; + $_ = "\@$tag $_"; + $tag =~ s/\s.*//; + } + } + elsif (defined($user_sub{$tag})) + { + s/^\@$tag\s+//; + $sub = $user_sub{$tag}; + print "# user $tag = $sub, arg: $_" if $T2H_DEBUG & $DEBUG_USER; + if (defined(&$sub)) + { + chop($_); + &$sub($_); + } + else + { + warn "$ERROR Bad user sub for $tag: $sub\n"; + } + next; + } + if (defined($def_map{$tag})) + { + s/^\@$tag\s+//; + if ($tag =~ /x$/) + { + # extra definition line + $tag = $`; + $is_extra = 1; + } + else + { + $is_extra = 0; + } + while (/\{([^\{\}]*)\}/) + { + # this is a {} construct + ($before, $contents, $after) = ($`, $1, $'); + # protect spaces + $contents =~ s/\s+/$;9/g; + # restore $_ protecting {} + $_ = "$before$;7$contents$;8$after"; + } + @args = split(/\s+/, &protect_html($_)); + foreach (@args) + { + s/$;9/ /g; # unprotect spaces + s/$;7/\{/g; # ... { + s/$;8/\}/g; # ... } + } + $type = shift(@args); + $type =~ s/^\{(.*)\}$/$1/; + print "# def ($tag): {$type} ", join(', ', @args), "\n" + if $T2H_DEBUG & $DEBUG_DEF; + if ($tag eq 'deftypecv') { + my $class = shift (@args); + $class =~ s/^\{(.*)\}$/$1/; + $type .= " of $class"; + } + $type .= ':' if (!$T2H_DEF_TABLE); # it's nicer like this + $name = shift(@args); + $name =~ s/^\{(.*)\}$/$1/; + if ($is_extra) + { + $_ = &debug("
", __LINE__) if (!$T2H_DEF_TABLE); + $_ = &debug("", __LINE__) if ($T2H_DEF_TABLE); + #$_ = &debug("
\n", __LINE__) if ($T2H_DEF_TABLE); + } + else + { + # APA:
implicitly ends paragraph, so let's + # do it explicitly to keep our HTML stack in sync. + if ($html_element eq 'P') + { + $_ = &debug("

\n", __LINE__); + &html_pop(); + } + else + { + $_ = ''; + } + $_ .= &debug("
\n
", __LINE__) if (!$T2H_DEF_TABLE); + $_ .= &debug("
\n", __LINE__) if ($T2H_DEF_TABLE); + } + if ($tag eq 'deffn' || $tag eq 'defvr' || $tag eq 'deftp') + { + if ($T2H_DEF_TABLE) + { + $_ .= "\n\n"; + $_ .= "\n\n"; + } + else + { + $_ .= "$type$name"; + $_ .= " @args" if @args; + } + } + elsif ($tag eq 'deftypefn' || $tag eq 'deftypevr' + || $tag eq 'deftypeop' || $tag eq 'defcv' + || $tag eq 'defop' || $tag eq 'deftypecv') + { + $ftype = $name; + $name = shift(@args); + $name =~ s/^\{(.*)\}$/$1/; + if ($T2H_DEF_TABLE) + { + $_ .= "\n\n"; + $_ .= "\n\n"; + } + else + { + my $sep = $ftype =~ /\*$/ ? '' : ' '; + $_ .= "$type $ftype$sep$name"; + $_ .= " @args" if @args; + } + } + else + { + warn "$ERROR Unknown definition type: $tag\n"; + $_ .= "$type$name"; + $_ .= " @args" if @args; + } + $_ .= &debug("\n
", __LINE__) if (!$T2H_DEF_TABLE); + ########$_ .= &debug("\n
$name\n"; + $_ .= " @args" if @args; + $_ .= ""; + $_ .= "$type
$name"; + $_ .= " @args" if @args; + $_ .= ""; + $_ .= "$type of $ftype
\n\n", __LINE__) if ($T2H_DEF_TABLE); + $name = &unprotect_html($name); + if ($tag eq 'deffn' || $tag eq 'deftypefn') + { + EnterIndexEntry('f', $name, $docu_doc, $section, \@lines); + # unshift(@input_spool, "\@findex $name\n"); + } + elsif ($tag eq 'defop') + { + EnterIndexEntry('f', "$name on $ftype", $docu_doc, $section, \@lines); + # unshift(@input_spool, "\@findex $name on $ftype\n"); + } + elsif ($tag eq 'defvr' || $tag eq 'deftypevr' || $tag eq 'defcv') + { + EnterIndexEntry('v', $name, $docu_doc, $section, \@lines); + # unshift(@input_spool, "\@vindex $name\n"); + } + else + { + EnterIndexEntry('t', $name, $docu_doc, $section, \@lines); + # unshift(@input_spool, "\@tindex $name\n"); + } + $dont_html = 1; + } + } + elsif ($end_tag) + { + if ($format_map{$end_tag}) + { + $in_pre = 0 if $format_map{$end_tag} eq 'PRE'; + $in_list-- if $format_map{$end_tag} eq 'UL' || $format_map{$end_tag} eq 'OL' ; + &html_pop_if('P'); + &html_pop_if('LI'); + &html_pop_if(); + push(@lines, &debug("\n", __LINE__)); + push(@lines, &html_debug('', __LINE__)); + } + elsif (exists $complex_format_map->{$end_tag}) + { + my $end = eval $complex_format_map->{$end_tag}->[1]; + if ($@) + { + print "$ERROR: eval of complex_format_map->{$end_tag}->[1] $complex_format_map->{$end_tag}->[0]: $@"; + $end = '' + } + $in_pre = 0 if $end =~ m||; + push(@lines, html_debug($end, __LINE__)); + } + elsif ($end_tag =~ /^(|f|v|multi)table$/) + { + unless (@tables) + { + warn "$ERROR \@end $end_tag without \@*table\n"; + next; + } + &html_pop_if('P'); + ($table_type, $in_table) = split($;, shift(@tables)); + unless ($1 eq $table_type) + { + warn "$ERROR \@end $end_tag without matching \@$end_tag\n"; + next; + } + if ($table_type eq "multi") + { + push(@lines, "
\n"); + &html_pop_if('TR'); + } + else + { + # APA: implicitly ends paragraph, so let's + # do it explicitly to keep our HTML stack in sync. + if ($html_element eq 'P') + { + push(@lines, &debug("

\n", __LINE__)); + &html_pop(); + } + push(@lines, "\n"); + &html_pop_if('DD'); + } + &html_pop_if(); + if (@tables) + { + ($table_type, $in_table) = split($;, $tables[0]); + } + else + { + $in_table = 0; + } + } + elsif (defined($def_map{$end_tag})) + { + # APA: and
implicitly ends paragraph, + # so let's do it explicitly to keep our HTML stack in + # sync. + if ($html_element eq 'P') + { + push(@lines, &debug("

\n", __LINE__)); + &html_pop(); + } + push(@lines, &debug("\n", __LINE__)) if (!$T2H_DEF_TABLE); + push(@lines, &debug("\n", __LINE__)) if ($T2H_DEF_TABLE); + } + elsif ($end_tag eq 'menu') + { + &html_pop_if(); + push(@lines, $_); # must keep it for pass 2 + } + next; + } + ############################################################# + # anchor insertion + while (/\@anchor\s*\{(.*?)\}/) + { + $_ = $`.$'; + my $anchor = $1; + $anchor = &normalise_node($anchor); + push @lines, &html_debug("\n"); + $node2href{$anchor} = "$docu_doc#$anchor"; + next INPUT_LINE if $_ =~ /^\s*$/; + } + ############################################################# + # index entry generation, after value substitutions + if (/^\@(\w+?)index\s+/) + { + EnterIndexEntry($1, $', $docu_doc, $section, \@lines); + next; + } + # + # protect texi and HTML things + &protect_texi; + $_ = &protect_html($_) unless $dont_html; + $dont_html = 0; + # substitution (unsupported things) + s/^\@exdent\s+//go; + s/\@noindent\s+//go; + s/\@refill\s+//go; + # other substitutions + &simple_substitutions; + s/\@footnote\{/\@footnote$docu_doc\{/g; # mark footnotes, cf. pass 4 + # + # analyze the tag again + # + if ($tag) + { + if (defined($sec2level{$tag}) && $sec2level{$tag} > 0) + { + if (/^\@$tag\s+(.+)$/) + { + $name = $1; + $name = &normalise_node($name); + $level = $sec2level{$tag}; + # check for index + $first_index_chapter = $name + if ($level == 1 && !$first_index_chapter && + $name =~ /index/i); + if ($in_top && /heading/) + { + $T2H_HAS_TOP_HEADING = 1; + $_ = &debug("$name\n", __LINE__); + &html_push_if('body'); + print "# top heading, section $name, level $level\n" + if $T2H_DEBUG & $DEBUG_TOC; + } + else + { + unless (/^\@\w*heading/) + { + unless (/^\@unnumbered/) + { + my $number = &update_sec_num($tag, $level); + $name = $number . ' ' . $name if $T2H_NUMBER_SECTIONS; + $sec2number{$name} = $number; + $number2sec{$number} = $name; + } + if (defined($toplevel)) + { + push @lines, ($level==$toplevel ? $CHAPTEREND : $SECTIONEND); + } + else + { + # first time we see a "section" + unless ($level == 1) + { + warn "$WARN The first section found is not of level 1: $_"; + } + $toplevel = $level; + } + push(@sections, $name); + next_doc() if (defined $T2H_SPLIT + and + ($T2H_SPLIT eq 'section' + || + $T2H_SPLIT && $level == $toplevel)); + } + $sec_num++; + $docid = "SEC$sec_num"; + $tocid = (/^\@\w*heading/ ? undef : "TOC$sec_num"); + # check biblio and glossary + $in_bibliography = ($name =~ /^([A-Z]|\d+)?(\.\d+)*\s*bibliography$/i); + $in_glossary = ($name =~ /^([A-Z]|\d+)?(\.\d+)*\s*glossary$/i); + # check node + if ($node) + { + warn "$ERROR Duplicate node found: $node\n" + if ($node2sec{$node}); + } + else + { + $name .= ' ' while ($node2sec{$name}); + $node = $name; + } + $name .= ' ' while ($sec2node{$name}); + $section = $name; + $node2sec{$node} = $name; + $sec2node{$name} = $node; + $sec2seccount{$name} = $sec_num; + $seccount2sec{$sec_num} = $name; + $node2href{$node} = "$docu_doc#$docid"; + $node2next{$node} = $node_next; + $node2prev{$node} = $node_prev; + $node2up{$node} = $node_up; + print "# node $node, section $name, level $level\n" + if $T2H_DEBUG & $DEBUG_TOC; + + $node = ''; + $node_next = ''; + $node_prev = ''; + $node_next = ''; + if ($tocid) + { + # update TOC + while ($level > $curlevel) + { + $curlevel++; + push(@toc_lines, "<$toc_indent>\n"); + } + while ($level < $curlevel) + { + $curlevel--; + push(@toc_lines, "\n"); + } + $_ = &t2h_anchor($tocid, "$docu_doc#$docid", $name, 1); + $_ = &substitute_style($_); + push(@stoc_lines, "$_
\n") if ($level == 1); + if ($T2H_NUMBER_SECTIONS) + { + push(@toc_lines, $_ . "
\n") + } + else + { + push(@toc_lines, "
  • " . $_ ."
  • "); + } + } + else + { + push(@lines, &html_debug("\n", + __LINE__)); + } + # update DOC + push(@lines, &html_debug('', __LINE__)); + &html_reset; + $_ = " $name \n\n"; + $_ = &debug($_, __LINE__); + push(@lines, &html_debug('', __LINE__)); + } + # update DOC + foreach $line (split(/\n+/, $_)) + { + push(@lines, "$line\n"); + } + next; + } + else + { + warn "$ERROR Bad section line: $_"; + } + } + else + { + # track variables + $value{$1} = Unprotect_texi($2), next if /^\@set\s+($VARRE)\s+(.*)$/o; + delete $value{$1}, next if /^\@clear\s+($VARRE)\s*$/o; + # store things + $value{'_shorttitle'} = Unprotect_texi($1), next if /^\@shorttitle\s+(.*)$/; + $value{'_setfilename'} = Unprotect_texi($1), next if /^\@setfilename\s+(.*)$/; + $value{'_settitle'} = Unprotect_texi($1), next if /^\@settitle\s+(.*)$/; + $value{'_author'} .= Unprotect_texi($1)."\n", next if /^\@author\s+(.*)$/; + $value{'_subtitle'} .= Unprotect_texi($1)."\n", next if /^\@subtitle\s+(.*)$/; + $value{'_title'} .= Unprotect_texi($1)."\n", next if /^\@title\s+(.*)$/; + + # list item + if (/^\s*\@itemx?\s+/) + { + $what = $'; + $what =~ s/\s+$//; + if ($in_bibliography && $use_bibliography) + { + if ($what =~ /^$BIBRE$/o) + { + $id = 'BIB' . ++$bib_num; + $bib2href{$what} = "$docu_doc#$id"; + print "# found bibliography for '$what' id $id\n" + if $T2H_DEBUG & $DEBUG_BIB; + $what = &t2h_anchor($id, '', $what); + } + } + elsif ($in_glossary && $T2H_USE_GLOSSARY) + { + $id = 'GLOSS' . ++$gloss_num; + $entry = $what; + $entry =~ tr/A-Z/a-z/ unless $entry =~ /^[A-Z\s]+$/; + $gloss2href{$entry} = "$docu_doc#$id"; + print "# found glossary for '$entry' id $id\n" + if $T2H_DEBUG & $DEBUG_GLOSS; + $what = &t2h_anchor($id, '', $what); + } + elsif ($in_table && ($table_type eq 'f' || $table_type eq 'v')) + { + # APA: Insert
    before index anchor, if + # necessary to produce valid HTML. Close open + # paragraph first. + if ($html_element ne 'DT') + { + # APA: End paragraph, if any. + if ($html_element eq 'P') + { + push(@lines, &debug("

    \n", __LINE__)); + &html_pop(); + } + push(@lines, &debug("
    ", __LINE__)); + &html_push('DT'); + } + EnterIndexEntry($table_type, $what, $docu_doc, $section, \@lines); + } + # APA: End paragraph, if any. + if ($html_element eq 'P') + { + push(@lines, &debug("

    \n", __LINE__)); + &html_pop(); + } + if ($html_element =~ m|^D[DLT]$|) + { + unless ($html_element eq 'DT') + { + push(@lines, &debug("
    ", __LINE__)); + } + if ($things_map{$in_table} && !$what) + { + # special case to allow @table @bullet for instance + push(@lines, &debug("$things_map{$in_table}\n", __LINE__)); + } + else + { + push(@lines, &debug("\@$in_table\{$what\}\n", __LINE__)); + } + push(@lines, "
    "); + &html_push('DD') unless $html_element eq 'DD'; + if ($table_type) + { # add also an index + unshift(@input_spool, "\@${table_type}index $what\n"); + } + } + elsif ($html_element eq 'TABLE') + { + push(@lines, &debug("$what\n", __LINE__)); + &html_push('TR'); + } + elsif ($html_element eq 'TR') + { + push(@lines, &debug("\n", __LINE__)); + push(@lines, &debug("$what\n", __LINE__)); + } + else + { + push(@lines, &debug("
  • $what\n", __LINE__)); + &html_push('LI') unless $html_element eq 'LI'; + } + push(@lines, &html_debug('', __LINE__)); + if ($deferred_ref) + { + push(@lines, &debug("$deferred_ref\n", __LINE__)); + $deferred_ref = ''; + } + next; + } + elsif (/^\@tab\s+(.*)$/) + { + push(@lines, "$1\n"); + next; + } + } + } + # paragraph separator + if ($_ eq "\n" && ! $in_pre) + { + next if $#lines >= 0 && $lines[$#lines] eq "\n"; + if ($html_element eq 'P') + { + push (@lines, &debug("

    \n

    \n", __LINE__)); + } + # else + # { + # push(@lines, "

    \n"); + # $_ = &debug("

    \n", __LINE__); + # } + elsif ($html_element eq 'body' || $html_element eq 'BLOCKQUOTE' || $html_element eq 'DD' || $html_element eq 'LI') + { + &html_push('P'); + push(@lines, &debug("

    \n", __LINE__)); + } + } + # otherwise + push(@lines, $_) unless $in_titlepage; + push(@lines, &debug("\n", __LINE__)) if ($tag eq 'center'); + } + # finish TOC + $level = 0; + while ($level < $curlevel) + { + $curlevel--; + push(@toc_lines, "\n"); + } + print "# end of pass 1\n" if $T2H_VERBOSE; +} + +#+++############################################################################ +# # +# Stuff related to Index generation # +# # +#---############################################################################ + +sub EnterIndexEntry +{ + my $prefix = shift; + my $key = shift; + my $docu_doc = shift; + my $section = shift; + my $lines = shift; + local $_; + + warn "$ERROR Undefined index command: $_", next + unless (exists ($index_properties->{$prefix})); + $key =~ s/\s+$//; + $_ = $key; + &protect_texi; + $key = $_; + $_ = &protect_html($_); + my $html_key = substitute_style($_); + my $id; + $key = remove_style($key); + $key = remove_things($key); + $_ = $key; + &unprotect_texi; + $key = $_; + while (exists $index->{$prefix}->{$key}) + { + $key .= ' '; + } + ; + if ($lines->[$#lines] =~ /^$/) + { + $id = $1; + } + else + { + $id = 'IDX' . ++$idx_num; + push(@$lines, &t2h_anchor($id, '', $T2H_INVISIBLE_MARK, !$in_pre)); + } + $index->{$prefix}->{$key}->{html_key} = $html_key; + $index->{$prefix}->{$key}->{section} = $section; + $index->{$prefix}->{$key}->{href} = "$docu_doc#$id"; + print "# found ${prefix}index for '$key' with id $id\n" + if $T2H_DEBUG & $DEBUG_INDEX; +} + +sub IndexName2Prefix +{ + my $name = shift; + my $prefix; + + for $prefix (keys %$index_properties) + { + return $prefix if ($index_properties->{$prefix}->{name} eq $name); + } + return undef; +} + +sub GetIndexEntries +{ + my $normal = shift; + my $code = shift; + my ($entries, $prefix, $key) = ({}); + for $prefix (keys %$normal) + { + for $key (keys %{$index->{$prefix}}) + { + $entries->{$key} = {%{$index->{$prefix}->{$key}}}; + } + } + + if (defined($code)) + { + for $prefix (keys %$code) + { + unless (exists $normal->{$prefix}) + { + for $key (keys %{$index->{$prefix}}) + { + $entries->{$key} = {%{$index->{$prefix}->{$key}}}; + $entries->{$key}->{html_key} = "$entries->{$key}->{html_key}"; + } + } + } + } + return $entries; +} + +sub byAlpha +{ + if ($a =~ /^[A-Za-z]/) + { + if ($b =~ /^[A-Za-z]/) + { + return lc($a) cmp lc($b); + } + else + { + return 1; + } + } + elsif ($b =~ /^[A-Za-z]/) + { + return -1; + } + else + { + return lc($a) cmp lc($b); + } +} + +sub GetIndexPages +{ + my $entries = shift; + my (@Letters, $key); + my ($EntriesByLetter, $Pages, $page) = ({}, [], {}); + my @keys = sort byAlpha keys %$entries; + + for $key (@keys) + { + push @{$EntriesByLetter->{uc(substr($key,0, 1))}} , $entries->{$key}; + } + @Letters = sort byAlpha keys %$EntriesByLetter; + $T2H_SPLIT_INDEX = 0 unless $T2H_SPLIT; + + unless ($T2H_SPLIT_INDEX) + { + $page->{First} = $Letters[0]; + $page->{Last} = $Letters[$#Letters]; + $page->{Letters} = \@Letters; + $page->{EntriesByLetter} = $EntriesByLetter; + push @$Pages, $page; + return $Pages; + } + + if ($T2H_SPLIT_INDEX =~ /^\d+$/) + { + my $i = 0; + my ($prev_letter, $letter); + for $letter (@Letters) + { + if ($i > $T2H_SPLIT_INDEX) + { + $page->{Last} = $prev_letter; + push @$Pages, $page; + $i=0; + } + if ($i == 0) + { + $page = {}; + $page->{Letters} = []; + $page->{EntriesByLetter} = {}; + $page->{First} = $letter; + } + push @{$page->{Letters}}, $letter; + $page->{EntriesByLetter}->{$letter} = [@{$EntriesByLetter->{$letter}}]; + $i += scalar(@{$EntriesByLetter->{$letter}}); + $prev_letter = $letter; + } + $page->{Last} = $Letters[$#Letters]; + push @$Pages, $page; + } + return $Pages; +} + +sub GetIndexSummary +{ + my $first_page = shift; + my $Pages = shift; + my $name = shift; + my ($page, $letter, $summary, $i, $l1, $l2, $l); + + $i = 0; + $summary = '
    Jump to:   '; + for $page ($first_page, @$Pages) + { + for $letter (@{$page->{Letters}}) + { + $l = t2h_anchor('', "$page->{href}#${name}_$letter", "$letter", + 0, 'style="text-decoration:none"') . "\n   \n"; + if ($letter =~ /^[A-Za-z]/) + { + $l2 .= $l; + } + else + { + $l1 .= $l; + } + } + } + $summary .= $l1 . "
    \n" if ($l1); + $summary .= $l2 . '
    '; + return $summary; +} + +sub PrintIndexPage +{ + my $lines = shift; + my $summary = shift; + my $page = shift; + my $name = shift; + + push @$lines, $summary; + + push @$lines , <

    + + + +EOT + + for $letter (@{$page->{Letters}}) + { + push @$lines, "\n"; + for $entry (@{$page->{EntriesByLetter}->{$letter}}) + { + push @$lines, + "\n"; + } + push @$lines, "\n"; + } + push @$lines, "
    Index Entry Section

    ".protect_html($letter)."
    " . + t2h_anchor('', $entry->{href}, $entry->{html_key}) . + "" . + t2h_anchor('', sec_href($entry->{section}), clean_name($entry->{section})) . + "

    "; + push @$lines, $summary; +} + +sub PrintIndex +{ + my $lines = shift; + my $name = shift; + my $section = shift; + $section = 'Top' unless $section; + my $prefix = IndexName2Prefix($name); + + warn ("$ERROR printindex: bad index name: $name"), return + unless $prefix; + + if ($index_properties->{$prefix}->{code}) + { + $index_properties->{$prefix}->{from_code}->{$prefix} = 1; + } + else + { + $index_properties->{$prefix}->{from}->{$prefix}= 1; + } + + my $Entries = GetIndexEntries($index_properties->{$prefix}->{from}, + $index_properties->{$prefix}->{from_code}); + return unless %$Entries; + + if ($T2H_IDX_SUMMARY) + { + my $key; + open(FHIDX, ">$docu_rdir$docu_name" . "_$name.idx") + || die "Can't open > $docu_rdir$docu_name" . "_$name.idx for writing: $!\n"; + print "# writing $name index summary in $docu_rdir$docu_name" . "_$name.idx...\n" if $T2H_VERBOSE; + + for $key (sort keys %$Entries) + { + print FHIDX "$key\t$Entries->{$key}->{href}\n"; + } + } + + my $Pages = GetIndexPages($Entries); + my $page; + my $first_page = shift @$Pages; + my $sec_name = $section; + + # remove section number + $sec_name =~ s/.*? // if $sec_name =~ /^([A-Z]|\d+)\./; + + ($first_page->{href} = sec_href($section)) =~ s/\#.*$//; + $node2prev{$section} = Sec2PrevNode($node2sec{$section}); + $prev_node = $section; + # Update tree structure of document + if (@$Pages) + { + my $sec; + my @after; + + while (@sections && $sections[$#sections] ne $section) + { + unshift @after, pop @sections; + } + + for $page (@$Pages) + { + my $node = ($page->{First} ne $page->{Last} ? + "$sec_name: $page->{First} -- $page->{Last}" : + "$sec_name: $page->{First}"); + push @sections, $node; + $node2sec{$node} = $node; + $sec2node{$node} = $node; + $node2up{$node} = $section; + $page->{href} = next_doc(); + $page->{name} = $node; + $node2href{$node} = $page->{href}; + if ($prev_node) + { + $node2next{$prev_node} = $node; + $node2prev{$node} = $prev_node; + } + $prev_node = $node; + } + # Full circle - Next on last index page goes to Top + $node2next{$prev_node} = "Top"; + push @sections, @after; + } + + my $summary = GetIndexSummary($first_page, $Pages, $name); + PrintIndexPage($lines, $summary, $first_page, $name); + for $page (@$Pages) + { + push @$lines, ($T2H_SPLIT eq 'chapter' ? $CHAPTEREND : $SECTIONEND); + push @$lines, "

    $page->{name}

    \n"; + PrintIndexPage($lines, $summary, $page, $name); + } +} + + +#+++############################################################################ +# # +# Pass 2/3: handle style, menu, index, cross-reference # +# # +#---############################################################################ +sub pass2 +{ + my $sec; + my $href; + @lines2 = (); # whole document (2nd pass) + @lines3 = (); # whole document (3rd pass) + my $in_menu = 0; # am I inside a menu + my $in_menu_listing; + + while (@lines) + { + $_ = shift(@lines); + # + # special case (protected sections) + # + if (/^$PROTECTTAG/o) + { + push(@lines2, $_); + next; + } + # + # menu + # + if (/^\@menu\b/) + { + $in_menu = 1; + $in_menu_listing = 1; + # APA: implicitly ends paragraph, so let's do it + # explicitly to keep our HTML stack in sync. + if ($html_element eq 'P') + { + push (@lines2, &debug("

    \n", __LINE__)); + &html_pop(); + } + push(@lines2, &debug("
    \n", __LINE__)); + next; + } + if (/^\@end\s+menu\b/) + { + if ($in_menu_listing) + { + push(@lines2, &debug("
    \n", __LINE__)); + } + $in_menu = 0; + $in_menu_listing = 0; + next; + } + if ($in_menu) + { + my ($node, $name, $descr); + if (/^\*\s+($NODERE)::/o) + { + $node = $1; + $descr = $'; + } + elsif (/^\*\s+(.+):\s+([^\t,\.\n]+)[\t,\.\n]/) + { + $name = $1; + $node = $2; + $descr = $'; + } + elsif (/^\*/) + { + warn "$ERROR Bad menu line: $_"; + } + else + { + if ($in_menu_listing) + { + # APA: Handle menu comment lines. These don't end the menu! + # $in_menu_listing = 0; + push(@lines2,&debug('' . $_ . ' +', __LINE__)); + } + } + if ($node) + { + if (! $in_menu_listing) + { + $in_menu_listing = 1; + push(@lines2, &debug("\n", __LINE__)); + } + # look for continuation + while ($lines[0] =~ /^\s+\w+/) + { + $descr .= shift(@lines); + } + &menu_entry($node, $name, $descr); + } + next; + } + # + # printindex + # + PrintIndex(\@lines2, $2, $1), next + if (/^\@printindex\s+(\w+)/); + # + # simple style substitutions + # + $_ = &substitute_style($_); + # + # xref + # + while (/\@(x|px|info|)ref\{([^{}]+)(\}?)/) + { + # note: Texinfo may accept other characters + ($type, $nodes, $full) = ($1, $2, $3); + ($before, $after) = ($`, $'); + if (! $full && $after) + { + warn "$ERROR Bad xref (no ending } on line): $_"; + $_ = "$before$;0${type}ref\{$nodes$after"; + next; # while xref + } + if ($type eq 'x') + { + $type = "$T2H_WORDS->{$T2H_LANG}->{'See'} "; + } + elsif ($type eq 'px') + { + $type = "$T2H_WORDS->{$T2H_LANG}->{'see'} "; + } + elsif ($type eq 'info') + { + $type = "$T2H_WORDS->{$T2H_LANG}->{'See'} Info"; + } + else + { + $type = ''; + } + unless ($full) + { + $next = shift(@lines); + $next = &substitute_style($next); + chop($nodes); # remove final newline + if ($next =~ /\}/) + { # split on 2 lines + $nodes .= " $`"; + $after = $'; + } + else + { + $nodes .= " $next"; + $next = shift(@lines); + $next = &substitute_style($next); + chop($nodes); + if ($next =~ /\}/) + { # split on 3 lines + $nodes .= " $`"; + $after = $'; + } + else + { + warn "$ERROR Bad xref (no ending }): $_"; + $_ = "$before$;0xref\{$nodes$after"; + unshift(@lines, $next); + next; # while xref + } + } + } + $nodes =~ s/\s+/ /go; # remove useless spaces + @args = split(/\s*,\s*/, $nodes); + $node = $args[0]; # the node is always the first arg + $node = &normalise_node($node); + $sec = $args[2] || $args[1] || $node2sec{$node}; + $href = $node2href{$node}; + if (@args == 5) + { # reference to another manual + $sec = $args[2] || $node; + $man = $args[4] || $args[3]; + $_ = "${before}${type}$T2H_WORDS->{$T2H_LANG}->{'section'} `$sec' in \@cite{$man}$after"; + } + elsif ($type =~ /Info/) + { # inforef + warn "$ERROR Wrong number of arguments: $_" unless @args == 3; + ($nn, $_, $in) = @args; + $_ = "${before}${type} file `$in', node `$nn'$after"; + } + elsif ($sec && $href && ! $T2H_SHORT_REF) + { + $_ = "${before}${type}"; + $_ .= "$T2H_WORDS->{$T2H_LANG}->{'section'} " if $type; + $_ .= &t2h_anchor('', $href, $sec) . $after; + } + elsif ($href) + { + $_ = "${before}${type} " . + &t2h_anchor('', $href, $args[2] || $args[1] || $node) . + $after; + } + else + { + warn "$ERROR Undefined node ($node): $_"; + $_ = "$before$;0xref{$nodes}$after"; + } + } + + # replace images + s[\@image\s*{(.+?)}] + { + my @args = split (/\s*,\s*/, $1); + my $base = $args[0]; + my $image = + LocateIncludeFile("$base.png") || + LocateIncludeFile("$base.jpg") || + LocateIncludeFile("$base.gif"); + warn "$ERROR no image file for $base: $_" unless ($image && -e $image); + ($T2H_CENTER_IMAGE ? + "
    \"$base\"
    " : + "\"$base\""); + }eg; + + # + # try to guess bibliography references or glossary terms + # + unless (/^/) + { + $done .= $pre . &t2h_anchor('', $href, $what); + } + else + { + $done .= "$pre$what"; + } + $_ = $post; + } + $_ = $done . $_; + } + if ($T2H_USE_GLOSSARY) + { + $done = ''; + while (/\b\w+\b/) + { + ($pre, $what, $post) = ($`, $&, $'); + $entry = $what; + $entry =~ tr/A-Z/a-z/ unless $entry =~ /^[A-Z\s]+$/; + $href = $gloss2href{$entry}; + if (defined($href) && $post !~ /^[^<]*<\/A>/) + { + $done .= $pre . &t2h_anchor('', $href, $what); + } + else + { + $done .= "$pre$what"; + } + $_ = $post; + } + $_ = $done . $_; + } + } + # otherwise + push(@lines2, $_); + } + print "# end of pass 2\n" if $T2H_VERBOSE; +} + +sub pass3 +{ + # + # split style substitutions + # + my $text; + while (@lines2) + { + $_ = shift(@lines2); + # + # special case (protected sections) + # + if (/^$PROTECTTAG/o) + { + push(@lines3, $_); + next; + } + # + # split style substitutions + # + $old = ''; + while ($old ne $_) + { + $old = $_; + if (/\@(\w+)\{/) + { + ($before, $style, $after) = ($`, $1, $'); + if (defined($style_map{$style})) + { + $_ = $after; + $text = ''; + $after = ''; + $failed = 1; + while (@lines2) + { + if (/\}/) + { + $text .= $`; + $after = $'; + $failed = 0; + last; + } + else + { + $text .= $_; + $_ = shift(@lines2); + } + } + if ($failed) + { + die "* Bad syntax (\@$style) after: $before\n"; + } + else + { + $text = &apply_style($style, $text); + $_ = "$before$text$after"; + } + } + } + } + # otherwise + push(@lines3, $_); + } + print "# end of pass 3\n" if $T2H_VERBOSE; +} + +#+++############################################################################ +# # +# Pass 4: foot notes, final cleanup # +# # +#---############################################################################ +sub pass4 +{ + my $text; + my $name; + @foot_lines = (); # footnotes + @doc_lines = (); # final document + $end_of_para = 0; # true if last line is

    + + # APA: There aint no paragraph before the first one! + # This fixes a HTML validation error. + $lines3[0] =~ s|^

    \n|\n|; + while (@lines3) + { + $_ = shift(@lines3); + # + # special case (protected sections) + # + if (/^$PROTECTTAG/o) + { + push(@doc_lines, $_); + $end_of_para = 0; + next; + } + # + # footnotes + # + while (/\@footnote([^\{\s]+)\{/) + { + ($before, $d, $after) = ($`, $1, $'); + $_ = $after; + $text = ''; + $after = ''; + $failed = 1; + while (@lines3) + { + if (/\}/) + { + $text .= $`; + $after = $'; + $failed = 0; + last; + } + else + { + $text .= $_; + $_ = shift(@lines3); + } + } + if ($failed) + { + die "* Bad syntax (\@footnote) after: $before\n"; + } + else + { + $foot_num++; + $docid = "DOCF$foot_num"; + $footid = "FOOT$foot_num"; + $foot = "($foot_num)"; + push(@foot_lines, "

    " . &t2h_anchor($footid, "$d#$docid", $foot) . "

    \n"); + $text = "

    $text" unless $text =~ /^\s*

    /; + push(@foot_lines, "$text\n"); + $_ = $before . &t2h_anchor($docid, "$docu_foot#$footid", $foot) . $after; + } + } + # + # remove unnecessary

    + # + if (/^\s*

    \s*$/) + { + next if $end_of_para++; + } + else + { + $end_of_para = 0; + } + # otherwise + push(@doc_lines, $_); + } + + print "# end of pass 4\n" if $T2H_VERBOSE; +} + +#+++############################################################################ +# # +# Pass 5: print things # +# # +#---############################################################################ +sub pass5 +{ + $T2H_L2H = &l2h_FinishToLatex if ($T2H_L2H); + $T2H_L2H = &l2h_ToHtml if ($T2H_L2H); + $T2H_L2H = &l2h_InitFromHtml if ($T2H_L2H); + + T2H_InitGlobals(); + + # fix node2up, node2prev, node2next, if desired + if ($has_top_command) + { + for $section (keys %sec2number) + { + $node2href{$sec2node{$section}} =~ /SEC(\d+)$/; + $node = $sec2node{$section}; + $node2up{$node} = Sec2UpNode($section) unless $node2up{$node}; + $node2prev{$node} = Sec2PrevNode($section) unless $node2prev{$node}; + $node2next{$node} = Sec2NextNode($section) unless $node2next{$node}; + } + } + + # prepare %T2H_THISDOC + $T2H_THISDOC{fulltitle} = $value{'_title'} || $value{'_settitle'} || "Untitled Document"; + $T2H_THISDOC{title} = $value{'_settitle'} || $T2H_THISDOC{fulltitle}; + $T2H_THISDOC{author} = $value{'_author'}; + $T2H_THISDOC{subtitle} = $value{'_subtitle'}; + $T2H_THISDOC{shorttitle} = $value{'_shorttitle'}; + for $key (keys %T2H_THISDOC) + { + $_ = &substitute_style($T2H_THISDOC{$key}); + &unprotect_texi; + s/\s*$//; + $T2H_THISDOC{$key} = $_; + } + + # if no sections, then simply print document as is + unless (@sections) + { + print "# Writing content into $docu_top_file \n" if $T2H_VERBOSE; + open(FILE, "> $docu_top_file") + || die "$ERROR: Can't open $docu_top_file for writing: $!\n"; + + &$T2H_print_page_head(\*FILE); + $T2H_THIS_SECTION = \@doc_lines; + t2h_print_lines(\*FILE); + &$T2H_print_foot_navigation(\*FILE); + &$T2H_print_page_foot(\*FILE); + close(FILE); + goto Finish; + } + + # initialize $T2H_HREF, $T2H_NAME + %T2H_HREF = + ( + 'First' , sec_href($sections[0]), + 'Last', sec_href($sections[$#sections]), + 'About', $docu_about. '#SEC_About', + ); + + # prepare TOC, OVERVIEW, TOP + $T2H_TOC = \@toc_lines; + $T2H_OVERVIEW = \@stoc_lines; + if ($has_top) + { + while (1) + { + $_ = shift @doc_lines; + last if /$TOPEND/; + push @$T2H_TOP, $_; + } + $T2H_HREF{'Top'} = $docu_top . '#SEC_Top'; + } + else + { + $T2H_HREF{'Top'} = $T2H_HREF{First}; + } + + $node2href{Top} = $T2H_HREF{Top}; + $T2H_HREF{Contents} = $docu_toc.'#SEC_Contents' if @toc_lines; + $T2H_HREF{Overview} = $docu_stoc.'#SEC_OVERVIEW' if @stoc_lines; + + # settle on index + if ($T2H_INDEX_CHAPTER) + { + $T2H_HREF{Index} = $node2href{normalise_node($T2H_INDEX_CHAPTER)}; + warn "$ERROR T2H_INDEX_CHAPTER '$T2H_INDEX_CHAPTER' not found\n" + unless $T2H_HREF{Index}; + } + if (! $T2H_HREF{Index} && $first_index_chapter) + { + $T2H_INDEX_CHAPTER = $first_index_chapter; + $T2H_HREF{Index} = $node2href{$T2H_INDEX_CHAPTER}; + } + + print "# Using '" . clean_name($T2H_INDEX_CHAPTER) . "' as index page\n" + if ($T2H_VERBOSE && $T2H_HREF{Index}); + + %T2H_NAME = + ( + 'First', clean_name($sec2node{$sections[0]}), + 'Last', clean_name($sec2node{$sections[$#sections]}), + 'About', $T2H_WORDS->{$T2H_LANG}->{'About_Title'}, + 'Contents', $T2H_WORDS->{$T2H_LANG}->{'ToC_Title'}, + 'Overview', $T2H_WORDS->{$T2H_LANG}->{'Overview_Title'}, + 'Index' , clean_name($T2H_INDEX_CHAPTER), + 'Top', clean_name($T2H_TOP_HEADING || $T2H_THISDOC{'title'} || $T2H_THISDOC{'shorttitle'}), + ); + + ############################################################################# + # print frame and frame toc file + # + if ( $T2H_FRAMES ) + { + open(FILE, "> $docu_frame_file") + || die "$ERROR: Can't open $docu_frame_file for writing: $!\n"; + print "# Creating frame in $docu_frame_file ...\n" if $T2H_VERBOSE; + &$T2H_print_frame(\*FILE); + close(FILE); + + open(FILE, "> $docu_toc_frame_file") + || die "$ERROR: Can't open $docu_toc_frame_file for writing: $!\n"; + print "# Creating toc frame in $docu_frame_file ...\n" if $T2H_VERBOSE; + &$T2H_print_toc_frame(\*FILE); + close(FILE); + } + + + ############################################################################# + # Monolithic beginning. + # + unless ($T2H_SPLIT) + { + open(FILE, "> $docu_doc_file") + || die "$ERROR: Can't open $docu_doc_file for writing: $!\n"; + &$T2H_print_page_head(\*FILE); + } + + + ############################################################################# + # print Top + # + if ($has_top) + { + if ($T2H_SPLIT) + { + open(FILE, "> $docu_top_file") + || die "$ERROR: Can't open $docu_top_file for writing: $!\n"; + } + + print "# Creating Top in $docu_top_file ...\n" if $T2H_VERBOSE; + $T2H_THIS_SECTION = $T2H_TOP; + $T2H_HREF{This} = $T2H_HREF{Top}; + $T2H_NAME{This} = $T2H_NAME{Top}; + &$T2H_print_Top(\*FILE); + + if ($T2H_SPLIT) + { + close(FILE) + || die "$ERROR: Error occurred when closing $docu_top_file: $!\n"; + } + } + + + ############################################################################# + # Print sections + # + $T2H_NODE{Forward} = $sec2node{$sections[0]}; + $T2H_NAME{Forward} = &clean_name($sec2node{$sections[0]}); + $T2H_HREF{Forward} = sec_href($sections[0]); + $T2H_NODE{This} = 'Top'; + $T2H_NAME{This} = $T2H_NAME{Top}; + $T2H_HREF{This} = $T2H_HREF{Top}; + if ($T2H_SPLIT) + { + print "# writing " . scalar(@sections) . + " sections into $docu_rdir$docu_name"."_[1..$doc_num].$docu_ext" + if $T2H_VERBOSE; + $previous = ($T2H_SPLIT eq 'chapter' ? $CHAPTEREND : $SECTIONEND); + undef $FH; + $doc_num = 0; + } + else + { + print "# writing " . scalar(@sections) . " sections in $docu_top_file ..." + if $T2H_VERBOSE; + $FH = \*FILE; + $previous = ''; + } + + $counter = 0; + # loop through sections + while ($section = shift(@sections)) + { + if ($T2H_SPLIT && ($T2H_SPLIT eq 'section' || $previous eq $CHAPTEREND)) + { + if ($FH) + { + #close previous page + &$T2H_print_chapter_footer($FH) if $T2H_SPLIT eq 'chapter'; + &$T2H_print_page_foot($FH); + close($FH); + undef $FH; + } + } + $T2H_NAME{Back} = $T2H_NAME{This}; + $T2H_HREF{Back} = $T2H_HREF{This}; + $T2H_NODE{Back} = $T2H_NODE{This}; + $T2H_NAME{This} = $T2H_NAME{Forward}; + $T2H_HREF{This} = $T2H_HREF{Forward}; + $T2H_NODE{This} = $T2H_NODE{Forward}; + if ($sections[0]) + { + $T2H_NODE{Forward} = $sec2node{$sections[0]}; + $T2H_NAME{Forward} = &clean_name($T2H_NODE{Forward}); + $T2H_HREF{Forward} = sec_href($sections[0]); + } + else + { + delete $T2H_HREF{Forward}; + delete $T2H_NODE{Forward}; + delete $T2H_NAME{Forward}; + } + + $node = $node2up{$T2H_NODE{This}}; + $T2H_HREF{Up} = $node2href{$node}; + if ($T2H_HREF{Up} eq $T2H_HREF{This} || ! $T2H_HREF{Up}) + { + $T2H_NAME{Up} = $T2H_NAME{Top}; + $T2H_HREF{Up} = $T2H_HREF{Top}; + $T2H_NODE{Up} = 'Up'; + } + else + { + $T2H_NAME{Up} = &clean_name($node); + $T2H_NODE{Up} = $node; + } + + $node = $node2prev{$T2H_NODE{This}}; + $T2H_NAME{Prev} = &clean_name($node); + $T2H_HREF{Prev} = $node2href{$node}; + $T2H_NODE{Prev} = $node; + + $node = Node2FastBack($T2H_NODE{This}); + $T2H_NAME{FastBack} = &clean_name($node); + $T2H_HREF{FastBack} = $node2href{$node}; + $T2H_NODE{FastBack} = $node; + + $node = $node2next{$T2H_NODE{This}}; + $T2H_NAME{Next} = &clean_name($node); + $T2H_HREF{Next} = $node2href{$node}; + $T2H_NODE{Next} = $node; + + $node = Node2FastForward($T2H_NODE{This}); + $T2H_NAME{FastForward} = &clean_name($node); + $T2H_HREF{FastForward} = $node2href{$node}; + $T2H_NODE{FastForward} = $node; + + if (! defined($FH)) + { + my $file = $T2H_HREF{This}; + $file =~ s/\#.*$//; + open(FILE, "> $docu_rdir$file") || + die "$ERROR: Can't open $docu_rdir$file for writing: $!\n"; + $FH = \*FILE; + &$T2H_print_page_head($FH); + t2h_print_label($FH); + &$T2H_print_chapter_header($FH) if $T2H_SPLIT eq 'chapter'; + } + else + { + t2h_print_label($FH); + } + + $T2H_THIS_SECTION = []; + while (@doc_lines) + { + $_ = shift(@doc_lines); + last if ($_ eq $SECTIONEND || $_ eq $CHAPTEREND); + push(@$T2H_THIS_SECTION, $_); + } + $previous = $_; + &$T2H_print_section($FH); + + if ($T2H_VERBOSE) + { + $counter++; + print "." if $counter =~ /00$/; + } + } + if ($T2H_SPLIT) + { + &$T2H_print_chapter_footer($FH) if $T2H_SPLIT eq 'chapter'; + &$T2H_print_page_foot($FH); + close($FH); + } + print "\n" if $T2H_VERBOSE; + + ############################################################################# + # Print ToC, Overview, Footnotes + # + delete $T2H_HREF{Prev}; + delete $T2H_HREF{Next}; + delete $T2H_HREF{Back}; + delete $T2H_HREF{Forward}; + delete $T2H_HREF{Up}; + + if (@foot_lines) + { + print "# writing Footnotes in $docu_foot_file...\n" if $T2H_VERBOSE; + open (FILE, "> $docu_foot_file") || die "$ERROR: Can't open $docu_foot_file for writing: $!\n" + if $T2H_SPLIT; + $T2H_HREF{This} = $docu_foot; + $T2H_NAME{This} = $T2H_WORDS->{$T2H_LANG}->{'Footnotes_Title'}; + $T2H_THIS_SECTION = \@foot_lines; + &$T2H_print_Footnotes(\*FILE); + close(FILE) if $T2H_SPLIT; + } + + if (@toc_lines) + { + print "# writing Toc in $docu_toc_file...\n" if $T2H_VERBOSE; + open (FILE, "> $docu_toc_file") || die "$ERROR: Can't open $docu_toc_file for writing: $!\n" + if $T2H_SPLIT; + $T2H_HREF{This} = $T2H_HREF{Contents}; + $T2H_NAME{This} = $T2H_NAME{Contents}; + $T2H_THIS_SECTION = \@toc_lines; + &$T2H_print_Toc(\*FILE); + close(FILE) if $T2H_SPLIT; + } + + if (@stoc_lines) + { + print "# writing Overview in $docu_stoc_file...\n" if $T2H_VERBOSE; + open (FILE, "> $docu_stoc_file") || die "$ERROR: Can't open $docu_stoc_file for writing: $!\n" + if $T2H_SPLIT; + $T2H_HREF{This} = $T2H_HREF{Overview}; + $T2H_NAME{This} = $T2H_NAME{Overview}; + $T2H_THIS_SECTION = \@stoc_lines; + unshift @$T2H_THIS_SECTION, "

    \n"; + push @$T2H_THIS_SECTION, "\n
    \n"; + &$T2H_print_Overview(\*FILE); + close(FILE) if $T2H_SPLIT; + } + + if ($about_body = &$T2H_about_body()) + { + print "# writing About in $docu_about_file...\n" if $T2H_VERBOSE; + open (FILE, "> $docu_about_file") || die "$ERROR: Can't open $docu_about_file for writing: $!\n" + if $T2H_SPLIT; + + $T2H_HREF{This} = $T2H_HREF{About}; + $T2H_NAME{This} = $T2H_NAME{About}; + $T2H_THIS_SECTION = [$about_body]; + &$T2H_print_About(\*FILE); + close(FILE) if $T2H_SPLIT; + } + + unless ($T2H_SPLIT) + { + &$T2H_print_page_foot(\*FILE); + close (FILE); + } + + Finish: + &l2h_FinishFromHtml if ($T2H_L2H); + &l2h_Finish if($T2H_L2H); + print "# that's all folks\n" if $T2H_VERBOSE; + + exit(0); +} + +#+++############################################################################ +# # +# Low level functions # +# # +#---############################################################################ + +sub LocateIncludeFile +{ + my $file = shift; + my $dir; + + # APA: Don't implicitely search ., to conform with the docs! + # return $file if (-e $file && -r $file); + foreach $dir (@T2H_INCLUDE_DIRS) + { + return "$dir/$file" if (-e "$dir/$file" && -r "$dir/$file"); + } + return undef; +} + +sub clean_name +{ + local ($_); + $_ = &remove_style($_[0]); + &unprotect_texi; + return $_; +} + +sub update_sec_num +{ + my($name, $level) = @_; + my $ret; + + $level--; # here we start at 0 + if ($name =~ /^appendix/ || @appendix_sec_num) + { + # appendix style + if (@appendix_sec_num) + { + &incr_sec_num($level, @appendix_sec_num); + } + else + { + @appendix_sec_num = ('A', 0, 0, 0); + } + $ret = join('.', @appendix_sec_num[0..$level]); + } + else + { + # normal style + if (@normal_sec_num) + { + &incr_sec_num($level, @normal_sec_num); + } + else + { + @normal_sec_num = (1, 0, 0, 0); + } + $ret = join('.', @normal_sec_num[0..$level]); + } + $ret .= "." if $level == 0; + return $ret; +} + +sub incr_sec_num +{ + local($level, $l); + $level = shift(@_); + $_[$level]++; + foreach $l ($level+1 .. 3) + { + $_[$l] = 0; + } +} + +sub Sec2UpNode +{ + my $sec = shift; + my $num = $sec2number{$sec}; + + return '' unless $num; + return 'Top' unless $num =~ /\.\d+/; + $num =~ s/\.[^\.]*$//; + $num = $num . '.' unless $num =~ /\./; + return $sec2node{$number2sec{$num}}; +} + +# Return previous node or "Top" +sub Sec2PrevNode +{ + my $sec = shift; + my $sec_num = $sec2seccount{$sec} - 1; + return "Top" if !$sec_num || $sec_num < 1; + return $sec2node{$seccount2sec{$sec_num}}; +} + +# Return next node or "Top" +sub Sec2NextNode +{ + my $sec = shift; + my $sec_num = $sec2seccount{$sec} + 1; + return "Top" unless exists $seccount2sec{$sec_num}; + return $sec2node{$seccount2sec{$sec_num}}; +} + +# +# sub Node2FastBack NODE +# +# INPUTS +# NODE A node +# +# RETURNS +# The beginning of this chapter, or if already there, the beginning of the +# previous chapter. +# +sub Node2FastBack +{ + my $node = shift; + my $num = $sec2number{$node2sec{$node}}; + my $n; + + # Index Pages have no section number and 1. should go back to Top + return $node2prev{$node} if !$num or $num eq "1."; + + # Get the current chapter + $num =~ /^([A-Z\d]+)\./; + $n = $1; + + # If the first section of this chapter, decrement chapter + $n = $n eq 'A' ? $normal_sec_num[0] : $n =~ /^\d+$/ ? --$n : chr(ord($n)-1) + if $n . '.' eq $num; + + # Return node name for section number "$n." + return $sec2node{$number2sec{$n . '.'}} || $node2prev{$node}; +} + +# +# sub Node2FastForward NODE +# +# INPUTS +# NODE A node +# +# RETURNS +# The beginning of the next chapter. +# +sub Node2FastForward +{ + my $node = shift; + my $num = $sec2number{$node2sec{$node}}; + my $n; + + # Index pages + return $node2next{$node} if !$num; + + # Get current chapter + $num =~ /^([A-Z\d]+)\./; + $n = $1; + + # Increment chapter + $n = $n eq $normal_sec_num[0] ? 'A' : ++$n; + + # Return node name + return $sec2node{$number2sec{$n . '.'}} || $node2next{$node}; +} + +sub check +{ + local($_, %seen, %context, $before, $match, $after); + + while (<>) + { + if (/\@(\*|\.|\:|\@|\{|\})/) + { + $seen{$&}++; + $context{$&} .= "> $_" if $T2H_VERBOSE; + $_ = "$`XX$'"; + redo; + } + if (/\@(\w+)/) + { + ($before, $match, $after) = ($`, $&, $'); + if ($before =~ /\b[-\w]+$/ && $after =~ /^[-\w.]*\b/) + { # e-mail address + $seen{'e-mail address'}++; + $context{'e-mail address'} .= "> $_" if $T2H_VERBOSE; + } + else + { + $seen{$match}++; + $context{$match} .= "> $_" if $T2H_VERBOSE; + } + $match =~ s/^\@/X/; + $_ = "$before$match$after"; + redo; + } + } + + foreach (sort(keys(%seen))) + { + if ($T2H_VERBOSE) + { + print "$_\n"; + print $context{$_}; + } + else + { + print "$_ ($seen{$_})\n"; + } + } +} + +sub open +{ + my($name) = @_; + + ++$fh_name; + no strict "refs"; + if (open($fh_name, $name)) + { + unshift(@fhs, $fh_name); + } + else + { + warn "$ERROR Can't read file $name: $!\n"; + } + use strict "refs"; +} + +sub init_input +{ + @fhs = (); # hold the file handles to read + @input_spool = (); # spooled lines to read + $fh_name = 'FH000'; + &open($docu); +} + +sub next_line +{ + my($fh, $line); + + if (@input_spool) + { + $line = shift(@input_spool); + return($line); + } + while (@fhs) + { + $fh = $fhs[0]; + $line = <$fh>; + return($line) if $line; + close($fh); + shift(@fhs); + } + return(undef); +} + +# used in pass 1, use &next_line +sub skip_until +{ + local($tag) = @_; + local($_); + + while ($_ = &next_line) + { + return if /^\@end\s+$tag\s*$/; + } + die "* Failed to find '$tag' after: " . $lines[$#lines]; +} + +# used in pass 1 for l2h use &next_line +sub string_until +{ + local($tag) = @_; + local($_, $string); + + while ($_ = &next_line) + { + return $string if /^\@end\s+$tag\s*$/; + # $_ =~ s/hbox/mbox/g; + $string = $string.$_; + } + die "* Failed to find '$tag' after: " . $lines[$#lines]; +} + +# +# HTML stacking to have a better HTML output +# + +sub html_reset +{ + @html_stack = ('html'); + $html_element = 'body'; +} + +sub html_push +{ + local($what) = @_; + push(@html_stack, $html_element); + $html_element = $what; +} + +sub html_push_if +{ + local($what) = @_; + push(@html_stack, $html_element) + if ($html_element && $html_element ne 'P'); + $html_element = $what; +} + +sub html_pop +{ + $html_element = pop(@html_stack); +} + +sub html_pop_if +{ + local($elt); + + if (@_) + { + foreach $elt (@_) + { + if ($elt eq $html_element) + { + $html_element = pop(@html_stack) if @html_stack; + last; + } + } + } + else + { + $html_element = pop(@html_stack) if @html_stack; + } +} + +sub html_debug +{ + my($what, $line) = @_; + if ($T2H_DEBUG & $DEBUG_HTML) + { + $what = "\n" unless $what; + return("$what") + } + return($what); +} + +# to debug the output... +sub debug +{ + my($what, $line) = @_; + return("$what") + if $T2H_DEBUG & $DEBUG_HTML; + return($what); +} + +sub SimpleTexi2Html +{ + local $_ = $_[0]; + &protect_texi; + &protect_html; + $_ = substitute_style($_); + $_[0] = $_; +} + +sub normalise_node +{ + local $_ = $_[0]; + s/\s+/ /go; + s/ $//; + s/^ //; + &protect_texi; + &protect_html; + $_ = substitute_style($_); + $_[0] = $_; +} + +sub menu_entry +{ + my ($node, $name, $descr) = @_; + my ($href, $entry); + + &normalise_node($node); + $href = $node2href{$node}; + if ($href) + { + $descr =~ s/^\s+//; + $descr =~ s/\s*$//; + $descr = SimpleTexi2Html($descr); + if ($T2H_NUMBER_SECTIONS && !$T2H_NODE_NAME_IN_MENU && $node2sec{$node}) + { + $entry = $node2sec{$node}; + $name = ''; + } + else + { + &normalise_node($name); + $entry = ($name && ($name ne $node || ! $T2H_AVOID_MENU_REDUNDANCY) + ? "$name : $node" : $node); + } + + if ($T2H_AVOID_MENU_REDUNDANCY && $descr) + { + my $clean_entry = $entry; + $clean_entry =~ s/^.*? // if ($clean_entry =~ /^([A-Z]|\d+)\.[\d\.]* /); + $clean_entry =~ s/[^\w]//g; + my $clean_descr = $descr; + $clean_descr =~ s/[^\w]//g; + $descr = '' if ($clean_entry eq $clean_descr) + } + push(@lines2,&debug('
    \n", __LINE__)); + } + elsif ($node =~ /^\(.*\)\w+/) + { + push(@lines2,&debug('\n", __LINE__)) + } + else + { + warn "$ERROR Undefined node of menu_entry ($node): $_"; + } +} + +sub do_ctrl { "^$_[0]" } + +sub do_email +{ + my($addr, $text) = split(/,\s*/, $_[0]); + + $text = $addr unless $text; + &t2h_anchor('', "mailto:$addr", $text); +} + +sub do_sc +{ + # l2h does this much better + return &l2h_ToLatex("{\\sc ".&unprotect_html($_[0])."}") if ($T2H_L2H); + return "\U$_[0]\E"; +} + +sub do_math +{ + # APA: FIXME + # This sub doesn't seem to be used. + # What are $_[0] and $text? + my $text; + return &l2h_ToLatex("\$".&unprotect_html($_[0])."\$") if ($T2H_L2H); + return "".$text.""; +} + +sub do_uref +{ + my($url, $text, $only_text) = split(/,\s*/, $_[0]); + # APA: Don't markup obviously bad links. + # e.g. texinfo.texi 4.0 has this, which would lead to a broken + # link: + # @section @code{@@uref@{@var{url}[, @var{text}][, @var{replacement}]@}} + return if $url =~ /[<>]/; + $text = $only_text if $only_text; + $text = $url unless $text; + &t2h_anchor('', $url, $text); +} + +sub do_url { &t2h_anchor('', $_[0], $_[0]) } + +sub do_acronym +{ + return '' . $_[0] . ''; +} + +sub do_accent +{ + return "&$_[0]acute;" if $_[1] eq 'H'; + return "$_[0]." if $_[1] eq 'dotaccent'; + return "$_[0]*" if $_[1] eq 'ringaccent'; + return "$_[0]".'[' if $_[1] eq 'tieaccent'; + return "$_[0]".'(' if $_[1] eq 'u'; + return "$_[0]_" if $_[1] eq 'ubaraccent'; + return ".$_[0]" if $_[1] eq 'udotaccent'; + return "$_[0]<" if $_[1] eq 'v'; + return "&$_[0]cedil;" if $_[1] eq ','; + return "$_[0]" if $_[1] eq 'dotless'; + return undef; +} + +sub apply_style +{ + my($texi_style, $text) = @_; + my($style); + + $style = $style_map{$texi_style}; + if (defined($style)) + { # known style + my $do_quotes = 0; + if ($style =~ /^\"/) + { # add quotes + $style = $'; + $do_quotes = 1; + } + if ($style =~ /^\&/) + { # custom + $style = $'; + no strict "refs"; + $text = &$style($text, $texi_style); + use strict "refs"; + } + elsif ($style) + { # good style + $text = "<$style>$text"; + } + else + { # no style + } + $text = "$text" if $do_quotes; + } + else + { # unknown style + $text = undef; + } + return($text); +} + +# remove Texinfo styles +sub remove_style +{ + local($_) = @_; + 1 while(s/\@\w+{([^\{\}]+)}/$1/g); + return($_); +} + +sub remove_things +{ + local ($_) = @_; + s|\@(\w+)\{\}|$1|g; + return $_; +} + +sub substitute_style +{ + local($_) = @_; + my($changed, $done, $style, $text); + + &simple_substitutions; + $changed = 1; + while ($changed) + { + $changed = 0; + $done = ''; + while (/\@(\w+)\{([^\{\}]+)\}/ || /\@(,)\{([^\{\}]+)\}/) + { + $text = &apply_style($1, $2); + if ($text) + { + $_ = "$`$text$'"; + $changed = 1; + } + else + { + $done .= "$`\@$1"; + $_ = "{$2}$'"; + } + } + $_ = $done . $_; + } + return($_); +} + +sub t2h_anchor +{ + my($name, $href, $text, $newline, $extra_attribs) = @_; + my($result); + + $result = ". + # APA: Keep it simple. This is what perl's CGI::espaceHTML does. + # We may consider using that instead. + # If raw HTML is used outside @ifhtml or @html it's an error + # anyway. + $what =~ s/\&/\&/go; + $what =~ s/\"/\"/go; + $what =~ s/\/\>/go; + return($what); +} + +sub unprotect_texi +{ + s/$;0/\@/go; + s/$;1/\{/go; + s/$;2/\}/go; + s/$;3/\`/go; + s/$;4/\'/go; +} + +sub Unprotect_texi +{ + local $_ = shift; + &unprotect_texi; + return($_); +} + +sub unprotect_html +{ + local($what) = @_; + # APA: Use + # Character entity references (eg. <) + # instead of + # Numeric character references (eg. <) + $what =~ s/\&/\&/go; + $what =~ s/\"/\"/go; + $what =~ s/\</\/go; + return($what); +} + +sub t2h_print_label +{ + my $fh = shift; + my $href = shift || $T2H_HREF{This}; + $href =~ s/.*#(.*)$/$1/; + print $fh qq{\n}; +} + +sub main +{ + SetDocumentLanguage('en') unless ($T2H_LANG); + # APA: There's got to be a better way: + $things_map{'today'} = &pretty_date; + # Identity: + $T2H_TODAY = &pretty_date; # like "20 September 1993" + # the eval prevents this from breaking on system which do not have + # a proper getpwuid implemented + eval { ($T2H_USER = (getpwuid ($<))[6]) =~ s/,.*//;}; # Who am i + # APA: Provide Windows NT workaround until getpwuid gets + # implemented there. + $T2H_USER = $ENV{'USERNAME'} unless defined $T2H_USER; + &pass1(); + &pass2(); + &pass3(); + &pass4(); + &pass5(); +} + +&main(); + +############################################################################## + +# These next few lines are legal in both Perl and nroff. + +.00 ; # finish .ig + +'di \" finish diversion--previous line must be blank +.nr nl 0-1 \" fake up transition to first page again +.nr % 0 \" start at page 1 +'; __END__ ############# From here on it's a standard manual page ############ + .so /usr/share/man/man1/texi2html.1 diff --git a/doc/texinfo.tex b/doc/texinfo.tex new file mode 100644 index 0000000..d93d432 --- /dev/null +++ b/doc/texinfo.tex @@ -0,0 +1,6976 @@ +% texinfo.tex -- TeX macros to handle Texinfo files. +% +% Load plain if necessary, i.e., if running under initex. +\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi +% +\def\texinfoversion{2004-04-07.08} +% +% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, +% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software +% Foundation, Inc. +% +% This texinfo.tex file is free software; you can redistribute it and/or +% modify it under the terms of the GNU General Public License as +% published by the Free Software Foundation; either version 2, or (at +% your option) any later version. +% +% This texinfo.tex file is distributed in the hope that it will be +% useful, but WITHOUT ANY WARRANTY; without even the implied warranty +% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +% General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this texinfo.tex file; see the file COPYING. If not, write +% to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +% Boston, MA 02111-1307, USA. +% +% As a special exception, when this file is read by TeX when processing +% a Texinfo source document, you may use the result without +% restriction. (This has been our intent since Texinfo was invented.) +% +% Please try the latest version of texinfo.tex before submitting bug +% reports; you can get the latest version from: +% http://www.gnu.org/software/texinfo/ (the Texinfo home page), or +% ftp://tug.org/tex/texinfo.tex +% (and all CTAN mirrors, see http://www.ctan.org). +% The texinfo.tex in any given distribution could well be out +% of date, so if that's what you're using, please check. +% +% Send bug reports to bug-texinfo@gnu.org. Please include including a +% complete document in each bug report with which we can reproduce the +% problem. Patches are, of course, greatly appreciated. +% +% To process a Texinfo manual with TeX, it's most reliable to use the +% texi2dvi shell script that comes with the distribution. For a simple +% manual foo.texi, however, you can get away with this: +% tex foo.texi +% texindex foo.?? +% tex foo.texi +% tex foo.texi +% dvips foo.dvi -o # or whatever; this makes foo.ps. +% The extra TeX runs get the cross-reference information correct. +% Sometimes one run after texindex suffices, and sometimes you need more +% than two; texi2dvi does it as many times as necessary. +% +% It is possible to adapt texinfo.tex for other languages, to some +% extent. You can get the existing language-specific files from the +% full Texinfo distribution. +% +% The GNU Texinfo home page is http://www.gnu.org/software/texinfo. + + +\message{Loading texinfo [version \texinfoversion]:} + +% If in a .fmt file, print the version number +% and turn on active characters that we couldn't do earlier because +% they might have appeared in the input file name. +\everyjob{\message{[Texinfo version \texinfoversion]}% + \catcode`+=\active \catcode`\_=\active} + +\message{Basics,} +\chardef\other=12 + +% We never want plain's \outer definition of \+ in Texinfo. +% For @tex, we can use \tabalign. +\let\+ = \relax + +% Save some plain tex macros whose names we will redefine. +\let\ptexb=\b +\let\ptexbullet=\bullet +\let\ptexc=\c +\let\ptexcomma=\, +\let\ptexdot=\. +\let\ptexdots=\dots +\let\ptexend=\end +\let\ptexequiv=\equiv +\let\ptexexclam=\! +\let\ptexfootnote=\footnote +\let\ptexgtr=> +\let\ptexhat=^ +\let\ptexi=\i +\let\ptexindent=\indent +\let\ptexnoindent=\noindent +\let\ptexinsert=\insert +\let\ptexlbrace=\{ +\let\ptexless=< +\let\ptexplus=+ +\let\ptexrbrace=\} +\let\ptexslash=\/ +\let\ptexstar=\* +\let\ptext=\t + +% If this character appears in an error message or help string, it +% starts a new line in the output. +\newlinechar = `^^J + +% Use TeX 3.0's \inputlineno to get the line number, for better error +% messages, but if we're using an old version of TeX, don't do anything. +% +\ifx\inputlineno\thisisundefined + \let\linenumber = \empty % Pre-3.0. +\else + \def\linenumber{l.\the\inputlineno:\space} +\fi + +% Set up fixed words for English if not already set. +\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi +\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi +\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi +\ifx\putwordin\undefined \gdef\putwordin{in}\fi +\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi +\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi +\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi +\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi +\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi +\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi +\ifx\putwordof\undefined \gdef\putwordof{of}\fi +\ifx\putwordon\undefined \gdef\putwordon{on}\fi +\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi +\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi +\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi +\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi +\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi +\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi +\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi +% +\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi +\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi +\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi +\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi +\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi +\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi +\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi +\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi +\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi +\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi +\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi +\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi +% +\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi +\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi +\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi +\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi +\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi + +% In some macros, we cannot use the `\? notation---the left quote is +% in some cases the escape char. +\chardef\colonChar = `\: +\chardef\commaChar = `\, +\chardef\dotChar = `\. +\chardef\exclamChar= `\! +\chardef\questChar = `\? +\chardef\semiChar = `\; +\chardef\underChar = `\_ + +\chardef\spaceChar = `\ % +\chardef\spacecat = 10 +\def\spaceisspace{\catcode\spaceChar=\spacecat} + +% Ignore a token. +% +\def\gobble#1{} + +% The following is used inside several \edef's. +\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname} + +% Hyphenation fixes. +\hyphenation{ + Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script + ap-pen-dix bit-map bit-maps + data-base data-bases eshell fall-ing half-way long-est man-u-script + man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm + par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces + spell-ing spell-ings + stand-alone strong-est time-stamp time-stamps which-ever white-space + wide-spread wrap-around +} + +% Margin to add to right of even pages, to left of odd pages. +\newdimen\bindingoffset +\newdimen\normaloffset +\newdimen\pagewidth \newdimen\pageheight + +% For a final copy, take out the rectangles +% that mark overfull boxes (in case you have decided +% that the text looks ok even though it passes the margin). +% +\def\finalout{\overfullrule=0pt} + +% @| inserts a changebar to the left of the current line. It should +% surround any changed text. This approach does *not* work if the +% change spans more than two lines of output. To handle that, we would +% have adopt a much more difficult approach (putting marks into the main +% vertical list for the beginning and end of each change). +% +\def\|{% + % \vadjust can only be used in horizontal mode. + \leavevmode + % + % Append this vertical mode material after the current line in the output. + \vadjust{% + % We want to insert a rule with the height and depth of the current + % leading; that is exactly what \strutbox is supposed to record. + \vskip-\baselineskip + % + % \vadjust-items are inserted at the left edge of the type. So + % the \llap here moves out into the left-hand margin. + \llap{% + % + % For a thicker or thinner bar, change the `1pt'. + \vrule height\baselineskip width1pt + % + % This is the space between the bar and the text. + \hskip 12pt + }% + }% +} + +% Sometimes it is convenient to have everything in the transcript file +% and nothing on the terminal. We don't just call \tracingall here, +% since that produces some useless output on the terminal. We also make +% some effort to order the tracing commands to reduce output in the log +% file; cf. trace.sty in LaTeX. +% +\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% +\def\loggingall{% + \tracingstats2 + \tracingpages1 + \tracinglostchars2 % 2 gives us more in etex + \tracingparagraphs1 + \tracingoutput1 + \tracingmacros2 + \tracingrestores1 + \showboxbreadth\maxdimen \showboxdepth\maxdimen + \ifx\eTeXversion\undefined\else % etex gives us more logging + \tracingscantokens1 + \tracingifs1 + \tracinggroups1 + \tracingnesting2 + \tracingassigns1 + \fi + \tracingcommands3 % 3 gives us more in etex + \errorcontextlines16 +}% + +% add check for \lastpenalty to plain's definitions. If the last thing +% we did was a \nobreak, we don't want to insert more space. +% +\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount + \removelastskip\penalty-50\smallskip\fi\fi} +\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount + \removelastskip\penalty-100\medskip\fi\fi} +\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount + \removelastskip\penalty-200\bigskip\fi\fi} + +% For @cropmarks command. +% Do @cropmarks to get crop marks. +% +\newif\ifcropmarks +\let\cropmarks = \cropmarkstrue +% +% Dimensions to add cropmarks at corners. +% Added by P. A. MacKay, 12 Nov. 1986 +% +\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines +\newdimen\cornerlong \cornerlong=1pc +\newdimen\cornerthick \cornerthick=.3pt +\newdimen\topandbottommargin \topandbottommargin=.75in + +% Main output routine. +\chardef\PAGE = 255 +\output = {\onepageout{\pagecontents\PAGE}} + +\newbox\headlinebox +\newbox\footlinebox + +% \onepageout takes a vbox as an argument. Note that \pagecontents +% does insertions, but you have to call it yourself. +\def\onepageout#1{% + \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi + % + \ifodd\pageno \advance\hoffset by \bindingoffset + \else \advance\hoffset by -\bindingoffset\fi + % + % Do this outside of the \shipout so @code etc. will be expanded in + % the headline as they should be, not taken literally (outputting ''code). + \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% + \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% + % + {% + % Have to do this stuff outside the \shipout because we want it to + % take effect in \write's, yet the group defined by the \vbox ends + % before the \shipout runs. + % + \escapechar = `\\ % use backslash in output files. + \indexdummies % don't expand commands in the output. + \normalturnoffactive % \ in index entries must not stay \, e.g., if + % the page break happens to be in the middle of an example. + \shipout\vbox{% + % Do this early so pdf references go to the beginning of the page. + \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi + % + \ifcropmarks \vbox to \outervsize\bgroup + \hsize = \outerhsize + \vskip-\topandbottommargin + \vtop to0pt{% + \line{\ewtop\hfil\ewtop}% + \nointerlineskip + \line{% + \vbox{\moveleft\cornerthick\nstop}% + \hfill + \vbox{\moveright\cornerthick\nstop}% + }% + \vss}% + \vskip\topandbottommargin + \line\bgroup + \hfil % center the page within the outer (page) hsize. + \ifodd\pageno\hskip\bindingoffset\fi + \vbox\bgroup + \fi + % + \unvbox\headlinebox + \pagebody{#1}% + \ifdim\ht\footlinebox > 0pt + % Only leave this space if the footline is nonempty. + % (We lessened \vsize for it in \oddfootingxxx.) + % The \baselineskip=24pt in plain's \makefootline has no effect. + \vskip 2\baselineskip + \unvbox\footlinebox + \fi + % + \ifcropmarks + \egroup % end of \vbox\bgroup + \hfil\egroup % end of (centering) \line\bgroup + \vskip\topandbottommargin plus1fill minus1fill + \boxmaxdepth = \cornerthick + \vbox to0pt{\vss + \line{% + \vbox{\moveleft\cornerthick\nsbot}% + \hfill + \vbox{\moveright\cornerthick\nsbot}% + }% + \nointerlineskip + \line{\ewbot\hfil\ewbot}% + }% + \egroup % \vbox from first cropmarks clause + \fi + }% end of \shipout\vbox + }% end of group with \normalturnoffactive + \advancepageno + \ifnum\outputpenalty>-20000 \else\dosupereject\fi +} + +\newinsert\margin \dimen\margin=\maxdimen + +\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} +{\catcode`\@ =11 +\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi +% marginal hacks, juha@viisa.uucp (Juha Takala) +\ifvoid\margin\else % marginal info is present + \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi +\dimen@=\dp#1 \unvbox#1 +\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi +\ifr@ggedbottom \kern-\dimen@ \vfil \fi} +} + +% Here are the rules for the cropmarks. Note that they are +% offset so that the space between them is truly \outerhsize or \outervsize +% (P. A. MacKay, 12 November, 1986) +% +\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} +\def\nstop{\vbox + {\hrule height\cornerthick depth\cornerlong width\cornerthick}} +\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} +\def\nsbot{\vbox + {\hrule height\cornerlong depth\cornerthick width\cornerthick}} + +% Parse an argument, then pass it to #1. The argument is the rest of +% the input line (except we remove a trailing comment). #1 should be a +% macro which expects an ordinary undelimited TeX argument. +% +\def\parsearg{\parseargusing{}} +\def\parseargusing#1#2{% + \def\next{#2}% + \begingroup + \obeylines + \spaceisspace + #1% + \parseargline\empty% Insert the \empty token, see \finishparsearg below. +} + +{\obeylines % + \gdef\parseargline#1^^M{% + \endgroup % End of the group started in \parsearg. + \argremovecomment #1\comment\ArgTerm% + }% +} + +% First remove any @comment, then any @c comment. +\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} +\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} + +% Each occurence of `\^^M' or `\^^M' is replaced by a single space. +% +% \argremovec might leave us with trailing space, e.g., +% @end itemize @c foo +% This space token undergoes the same procedure and is eventually removed +% by \finishparsearg. +% +\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M} +\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M} +\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{% + \def\temp{#3}% + \ifx\temp\empty + % We cannot use \next here, as it holds the macro to run; + % thus we reuse \temp. + \let\temp\finishparsearg + \else + \let\temp\argcheckspaces + \fi + % Put the space token in: + \temp#1 #3\ArgTerm +} + +% If a _delimited_ argument is enclosed in braces, they get stripped; so +% to get _exactly_ the rest of the line, we had to prevent such situation. +% We prepended an \empty token at the very beginning and we expand it now, +% just before passing the control to \next. +% (Similarily, we have to think about #3 of \argcheckspacesY above: it is +% either the null string, or it ends with \^^M---thus there is no danger +% that a pair of braces would be stripped. +% +% But first, we have to remove the trailing space token. +% +\def\finishparsearg#1 \ArgTerm{\expandafter\next\expandafter{#1}} + +% \parseargdef\foo{...} +% is roughly equivalent to +% \def\foo{\parsearg\Xfoo} +% \def\Xfoo#1{...} +% +% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my +% favourite TeX trick. --kasal, 16nov03 + +\def\parseargdef#1{% + \expandafter \doparseargdef \csname\string#1\endcsname #1% +} +\def\doparseargdef#1#2{% + \def#2{\parsearg#1}% + \def#1##1% +} + +% Several utility definitions with active space: +{ + \obeyspaces + \gdef\obeyedspace{ } + + % Make each space character in the input produce a normal interword + % space in the output. Don't allow a line break at this space, as this + % is used only in environments like @example, where each line of input + % should produce a line of output anyway. + % + \gdef\sepspaces{\obeyspaces\let =\tie} + + % If an index command is used in an @example environment, any spaces + % therein should become regular spaces in the raw index file, not the + % expansion of \tie (\leavevmode \penalty \@M \ ). + \gdef\unsepspaces{\let =\space} +} + + +\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} + +% Define the framework for environments in texinfo.tex. It's used like this: +% +% \envdef\foo{...} +% \def\Efoo{...} +% +% It's the responsibility of \envdef to insert \begingroup before the +% actual body; @end closes the group after calling \Efoo. \envdef also +% defines \thisenv, so the current environment is known; @end checks +% whether the environment name matches. The \checkenv macro can also be +% used to check whether the current environment is the one expected. +% +% Non-false conditionals (@iftex, @ifset) don't fit into this, so they +% are not treated as enviroments; they don't open a group. (The +% implementation of @end takes care not to call \endgroup in this +% special case.) + + +% At runtime, environments start with this: +\def\startenvironment#1{\begingroup\def\thisenv{#1}} +% initialize +\let\thisenv\empty + +% ... but they get defined via ``\envdef\foo{...}'': +\long\def\envdef#1#2{\def#1{\startenvironment#1#2}} +\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} + +% Check whether we're in the right environment: +\def\checkenv#1{% + \def\temp{#1}% + \ifx\thisenv\temp + \else + \badenverr + \fi +} + +% Evironment mismatch, #1 expected: +\def\badenverr{% + \errhelp = \EMsimple + \errmessage{This command can appear only \inenvironment\temp, + not \inenvironment\thisenv}% +} +\def\inenvironment#1{% + \ifx#1\empty + out of any environment% + \else + in environment \expandafter\string#1% + \fi +} + +% @end foo executes the definition of \Efoo. +% But first, it executes a specialized version of \checkenv +% +\parseargdef\end{% + \if 1\csname iscond.#1\endcsname + \else + % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03 + \expandafter\checkenv\csname#1\endcsname + \csname E#1\endcsname + \endgroup + \fi +} + +\newhelp\EMsimple{Press RETURN to continue.} + + +%% Simple single-character @ commands + +% @@ prints an @ +% Kludge this until the fonts are right (grr). +\def\@{{\tt\char64}} + +% This is turned off because it was never documented +% and you can use @w{...} around a quote to suppress ligatures. +%% Define @` and @' to be the same as ` and ' +%% but suppressing ligatures. +%\def\`{{`}} +%\def\'{{'}} + +% Used to generate quoted braces. +\def\mylbrace {{\tt\char123}} +\def\myrbrace {{\tt\char125}} +\let\{=\mylbrace +\let\}=\myrbrace +\begingroup + % Definitions to produce \{ and \} commands for indices, + % and @{ and @} for the aux file. + \catcode`\{ = \other \catcode`\} = \other + \catcode`\[ = 1 \catcode`\] = 2 + \catcode`\! = 0 \catcode`\\ = \other + !gdef!lbracecmd[\{]% + !gdef!rbracecmd[\}]% + !gdef!lbraceatcmd[@{]% + !gdef!rbraceatcmd[@}]% +!endgroup + +% @comma{} to avoid , parsing problems. +\let\comma = , + +% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent +% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. +\let\, = \c +\let\dotaccent = \. +\def\ringaccent#1{{\accent23 #1}} +\let\tieaccent = \t +\let\ubaraccent = \b +\let\udotaccent = \d + +% Other special characters: @questiondown @exclamdown @ordf @ordm +% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. +\def\questiondown{?`} +\def\exclamdown{!`} +\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} +\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} + +% Dotless i and dotless j, used for accents. +\def\imacro{i} +\def\jmacro{j} +\def\dotless#1{% + \def\temp{#1}% + \ifx\temp\imacro \ptexi + \else\ifx\temp\jmacro \j + \else \errmessage{@dotless can be used only with i or j}% + \fi\fi +} + +% The \TeX{} logo, as in plain, but resetting the spacing so that a +% period following counts as ending a sentence. (Idea found in latex.) +% +\edef\TeX{\TeX \spacefactor=3000 } + +% @LaTeX{} logo. Not quite the same results as the definition in +% latex.ltx, since we use a different font for the raised A; it's most +% convenient for us to use an explicitly smaller font, rather than using +% the \scriptstyle font (since we don't reset \scriptstyle and +% \scriptscriptstyle). +% +\def\LaTeX{% + L\kern-.36em + {\setbox0=\hbox{T}% + \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}% + \kern-.15em + \TeX +} + +% Be sure we're in horizontal mode when doing a tie, since we make space +% equivalent to this in @example-like environments. Otherwise, a space +% at the beginning of a line will start with \penalty -- and +% since \penalty is valid in vertical mode, we'd end up putting the +% penalty on the vertical list instead of in the new paragraph. +{\catcode`@ = 11 + % Avoid using \@M directly, because that causes trouble + % if the definition is written into an index file. + \global\let\tiepenalty = \@M + \gdef\tie{\leavevmode\penalty\tiepenalty\ } +} + +% @: forces normal size whitespace following. +\def\:{\spacefactor=1000 } + +% @* forces a line break. +\def\*{\hfil\break\hbox{}\ignorespaces} + +% @/ allows a line break. +\let\/=\allowbreak + +% @. is an end-of-sentence period. +\def\.{.\spacefactor=3000 } + +% @! is an end-of-sentence bang. +\def\!{!\spacefactor=3000 } + +% @? is an end-of-sentence query. +\def\?{?\spacefactor=3000 } + +% @w prevents a word break. Without the \leavevmode, @w at the +% beginning of a paragraph, when TeX is still in vertical mode, would +% produce a whole line of output instead of starting the paragraph. +\def\w#1{\leavevmode\hbox{#1}} + +% @group ... @end group forces ... to be all on one page, by enclosing +% it in a TeX vbox. We use \vtop instead of \vbox to construct the box +% to keep its height that of a normal line. According to the rules for +% \topskip (p.114 of the TeXbook), the glue inserted is +% max (\topskip - \ht (first item), 0). If that height is large, +% therefore, no glue is inserted, and the space between the headline and +% the text is small, which looks bad. +% +% Another complication is that the group might be very large. This can +% cause the glue on the previous page to be unduly stretched, because it +% does not have much material. In this case, it's better to add an +% explicit \vfill so that the extra space is at the bottom. The +% threshold for doing this is if the group is more than \vfilllimit +% percent of a page (\vfilllimit can be changed inside of @tex). +% +\newbox\groupbox +\def\vfilllimit{0.7} +% +\envdef\group{% + \ifnum\catcode`\^^M=\active \else + \errhelp = \groupinvalidhelp + \errmessage{@group invalid in context where filling is enabled}% + \fi + \startsavinginserts + % + \setbox\groupbox = \vtop\bgroup + % Do @comment since we are called inside an environment such as + % @example, where each end-of-line in the input causes an + % end-of-line in the output. We don't want the end-of-line after + % the `@group' to put extra space in the output. Since @group + % should appear on a line by itself (according to the Texinfo + % manual), we don't worry about eating any user text. + \comment +} +% +% The \vtop produces a box with normal height and large depth; thus, TeX puts +% \baselineskip glue before it, and (when the next line of text is done) +% \lineskip glue after it. Thus, space below is not quite equal to space +% above. But it's pretty close. +\def\Egroup{% + % To get correct interline space between the last line of the group + % and the first line afterwards, we have to propagate \prevdepth. + \endgraf % Not \par, as it may have been set to \lisppar. + \global\dimen1 = \prevdepth + \egroup % End the \vtop. + % \dimen0 is the vertical size of the group's box. + \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox + % \dimen2 is how much space is left on the page (more or less). + \dimen2 = \pageheight \advance\dimen2 by -\pagetotal + % if the group doesn't fit on the current page, and it's a big big + % group, force a page break. + \ifdim \dimen0 > \dimen2 + \ifdim \pagetotal < \vfilllimit\pageheight + \page + \fi + \fi + \box\groupbox + \prevdepth = \dimen1 + \checkinserts +} +% +% TeX puts in an \escapechar (i.e., `@') at the beginning of the help +% message, so this ends up printing `@group can only ...'. +% +\newhelp\groupinvalidhelp{% +group can only be used in environments such as @example,^^J% +where each line of input produces a line of output.} + +% @need space-in-mils +% forces a page break if there is not space-in-mils remaining. + +\newdimen\mil \mil=0.001in + +% Old definition--didn't work. +%\parseargdef\need{\par % +%% This method tries to make TeX break the page naturally +%% if the depth of the box does not fit. +%{\baselineskip=0pt% +%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak +%\prevdepth=-1000pt +%}} + +\parseargdef\need{% + % Ensure vertical mode, so we don't make a big box in the middle of a + % paragraph. + \par + % + % If the @need value is less than one line space, it's useless. + \dimen0 = #1\mil + \dimen2 = \ht\strutbox + \advance\dimen2 by \dp\strutbox + \ifdim\dimen0 > \dimen2 + % + % Do a \strut just to make the height of this box be normal, so the + % normal leading is inserted relative to the preceding line. + % And a page break here is fine. + \vtop to #1\mil{\strut\vfil}% + % + % TeX does not even consider page breaks if a penalty added to the + % main vertical list is 10000 or more. But in order to see if the + % empty box we just added fits on the page, we must make it consider + % page breaks. On the other hand, we don't want to actually break the + % page after the empty box. So we use a penalty of 9999. + % + % There is an extremely small chance that TeX will actually break the + % page at this \penalty, if there are no other feasible breakpoints in + % sight. (If the user is using lots of big @group commands, which + % almost-but-not-quite fill up a page, TeX will have a hard time doing + % good page breaking, for example.) However, I could not construct an + % example where a page broke at this \penalty; if it happens in a real + % document, then we can reconsider our strategy. + \penalty9999 + % + % Back up by the size of the box, whether we did a page break or not. + \kern -#1\mil + % + % Do not allow a page break right after this kern. + \nobreak + \fi +} + +% @br forces paragraph break (and is undocumented). + +\let\br = \par + +% @page forces the start of a new page. +% +\def\page{\par\vfill\supereject} + +% @exdent text.... +% outputs text on separate line in roman font, starting at standard page margin + +% This records the amount of indent in the innermost environment. +% That's how much \exdent should take out. +\newskip\exdentamount + +% This defn is used inside fill environments such as @defun. +\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break} + +% This defn is used inside nofill environments such as @example. +\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount + \leftline{\hskip\leftskip{\rm#1}}}} + +% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current +% paragraph. For more general purposes, use the \margin insertion +% class. WHICH is `l' or `r'. +% +\newskip\inmarginspacing \inmarginspacing=1cm +\def\strutdepth{\dp\strutbox} +% +\def\doinmargin#1#2{\strut\vadjust{% + \nobreak + \kern-\strutdepth + \vtop to \strutdepth{% + \baselineskip=\strutdepth + \vss + % if you have multiple lines of stuff to put here, you'll need to + % make the vbox yourself of the appropriate size. + \ifx#1l% + \llap{\ignorespaces #2\hskip\inmarginspacing}% + \else + \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% + \fi + \null + }% +}} +\def\inleftmargin{\doinmargin l} +\def\inrightmargin{\doinmargin r} +% +% @inmargin{TEXT [, RIGHT-TEXT]} +% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; +% else use TEXT for both). +% +\def\inmargin#1{\parseinmargin #1,,\finish} +\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0 > 0pt + \def\lefttext{#1}% have both texts + \def\righttext{#2}% + \else + \def\lefttext{#1}% have only one text + \def\righttext{#1}% + \fi + % + \ifodd\pageno + \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin + \else + \def\temp{\inleftmargin\lefttext}% + \fi + \temp +} + +% @include file insert text of that file as input. +% +\def\include{\parseargusing\filenamecatcodes\includezzz} +\def\includezzz#1{% + \pushthisfilestack + \def\thisfile{#1}% + {% + \makevalueexpandable + \def\temp{\input #1 }% + \expandafter + }\temp + \popthisfilestack +} +\def\filenamecatcodes{% + \catcode`\\=\other + \catcode`~=\other + \catcode`^=\other + \catcode`_=\other + \catcode`|=\other + \catcode`<=\other + \catcode`>=\other + \catcode`+=\other + \catcode`-=\other +} + +\def\pushthisfilestack{% + \expandafter\pushthisfilestackX\popthisfilestack\StackTerm +} +\def\pushthisfilestackX{% + \expandafter\pushthisfilestackY\thisfile\StackTerm +} +\def\pushthisfilestackY #1\StackTerm #2\StackTerm {% + \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}% +} + +\def\popthisfilestack{\errthisfilestackempty} +\def\errthisfilestackempty{\errmessage{Internal error: + the stack of filenames is empty.}} + +\def\thisfile{} + +% @center line +% outputs that line, centered. +% +\parseargdef\center{% + \ifhmode + \let\next\centerH + \else + \let\next\centerV + \fi + \next{\hfil \ignorespaces#1\unskip \hfil}% +} +\def\centerH#1{% + {% + \hfil\break + \advance\hsize by -\leftskip + \advance\hsize by -\rightskip + \line{#1}% + \break + }% +} +\def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}} + +% @sp n outputs n lines of vertical space + +\parseargdef\sp{\vskip #1\baselineskip} + +% @comment ...line which is ignored... +% @c is the same as @comment +% @ignore ... @end ignore is another way to write a comment + +\def\comment{\begingroup \catcode`\^^M=\other% +\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% +\commentxxx} +{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} + +\let\c=\comment + +% @paragraphindent NCHARS +% We'll use ems for NCHARS, close enough. +% NCHARS can also be the word `asis' or `none'. +% We cannot feasibly implement @paragraphindent asis, though. +% +\def\asisword{asis} % no translation, these are keywords +\def\noneword{none} +% +\parseargdef\paragraphindent{% + \def\temp{#1}% + \ifx\temp\asisword + \else + \ifx\temp\noneword + \defaultparindent = 0pt + \else + \defaultparindent = #1em + \fi + \fi + \parindent = \defaultparindent +} + +% @exampleindent NCHARS +% We'll use ems for NCHARS like @paragraphindent. +% It seems @exampleindent asis isn't necessary, but +% I preserve it to make it similar to @paragraphindent. +\parseargdef\exampleindent{% + \def\temp{#1}% + \ifx\temp\asisword + \else + \ifx\temp\noneword + \lispnarrowing = 0pt + \else + \lispnarrowing = #1em + \fi + \fi +} + +% @firstparagraphindent WORD +% If WORD is `none', then suppress indentation of the first paragraph +% after a section heading. If WORD is `insert', then do indent at such +% paragraphs. +% +% The paragraph indentation is suppressed or not by calling +% \suppressfirstparagraphindent, which the sectioning commands do. +% We switch the definition of this back and forth according to WORD. +% By default, we suppress indentation. +% +\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent} +\def\insertword{insert} +% +\parseargdef\firstparagraphindent{% + \def\temp{#1}% + \ifx\temp\noneword + \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent + \else\ifx\temp\insertword + \let\suppressfirstparagraphindent = \relax + \else + \errhelp = \EMsimple + \errmessage{Unknown @firstparagraphindent option `\temp'}% + \fi\fi +} + +% Here is how we actually suppress indentation. Redefine \everypar to +% \kern backwards by \parindent, and then reset itself to empty. +% +% We also make \indent itself not actually do anything until the next +% paragraph. +% +\gdef\dosuppressfirstparagraphindent{% + \gdef\indent{% + \restorefirstparagraphindent + \indent + }% + \gdef\noindent{% + \restorefirstparagraphindent + \noindent + }% + \global\everypar = {% + \kern -\parindent + \restorefirstparagraphindent + }% +} + +\gdef\restorefirstparagraphindent{% + \global \let \indent = \ptexindent + \global \let \noindent = \ptexnoindent + \global \everypar = {}% +} + + +% @asis just yields its argument. Used with @table, for example. +% +\def\asis#1{#1} + +% @math outputs its argument in math mode. +% +% One complication: _ usually means subscripts, but it could also mean +% an actual _ character, as in @math{@var{some_variable} + 1}. So make +% _ active, and distinguish by seeing if the current family is \slfam, +% which is what @var uses. +{ + \catcode\underChar = \active + \gdef\mathunderscore{% + \catcode\underChar=\active + \def_{\ifnum\fam=\slfam \_\else\sb\fi}% + } +} +% Another complication: we want \\ (and @\) to output a \ character. +% FYI, plain.tex uses \\ as a temporary control sequence (why?), but +% this is not advertised and we don't care. Texinfo does not +% otherwise define @\. +% +% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. +\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} +% +\def\math{% + \tex + \mathunderscore + \let\\ = \mathbackslash + \mathactive + $\finishmath +} +\def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. + +% Some active characters (such as <) are spaced differently in math. +% We have to reset their definitions in case the @math was an argument +% to a command which sets the catcodes (such as @item or @section). +% +{ + \catcode`^ = \active + \catcode`< = \active + \catcode`> = \active + \catcode`+ = \active + \gdef\mathactive{% + \let^ = \ptexhat + \let< = \ptexless + \let> = \ptexgtr + \let+ = \ptexplus + } +} + +% @bullet and @minus need the same treatment as @math, just above. +\def\bullet{$\ptexbullet$} +\def\minus{$-$} + +% @dots{} outputs an ellipsis using the current font. +% We do .5em per period so that it has the same spacing in a typewriter +% font as three actual period characters. +% +\def\dots{% + \leavevmode + \hbox to 1.5em{% + \hskip 0pt plus 0.25fil + .\hfil.\hfil.% + \hskip 0pt plus 0.5fil + }% +} + +% @enddots{} is an end-of-sentence ellipsis. +% +\def\enddots{% + \dots + \spacefactor=3000 +} + +% @comma{} is so commas can be inserted into text without messing up +% Texinfo's parsing. +% +\let\comma = , + +% @refill is a no-op. +\let\refill=\relax + +% If working on a large document in chapters, it is convenient to +% be able to disable indexing, cross-referencing, and contents, for test runs. +% This is done with @novalidate (before @setfilename). +% +\newif\iflinks \linkstrue % by default we want the aux files. +\let\novalidate = \linksfalse + +% @setfilename is done at the beginning of every texinfo file. +% So open here the files we need to have open while reading the input. +% This makes it possible to make a .fmt file for texinfo. +\def\setfilename{% + \fixbackslash % Turn off hack to swallow `\input texinfo'. + \iflinks + \tryauxfile + % Open the new aux file. TeX will close it automatically at exit. + \immediate\openout\auxfile=\jobname.aux + \fi % \openindices needs to do some work in any case. + \openindices + \let\setfilename=\comment % Ignore extra @setfilename cmds. + % + % If texinfo.cnf is present on the system, read it. + % Useful for site-wide @afourpaper, etc. + \openin 1 texinfo.cnf + \ifeof 1 \else \input texinfo.cnf \fi + \closein 1 + % + \comment % Ignore the actual filename. +} + +% Called from \setfilename. +% +\def\openindices{% + \newindex{cp}% + \newcodeindex{fn}% + \newcodeindex{vr}% + \newcodeindex{tp}% + \newcodeindex{ky}% + \newcodeindex{pg}% +} + +% @bye. +\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} + + +\message{pdf,} +% adobe `portable' document format +\newcount\tempnum +\newcount\lnkcount +\newtoks\filename +\newcount\filenamelength +\newcount\pgn +\newtoks\toksA +\newtoks\toksB +\newtoks\toksC +\newtoks\toksD +\newbox\boxA +\newcount\countA +\newif\ifpdf +\newif\ifpdfmakepagedest + +% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 +% can be set). So we test for \relax and 0 as well as \undefined, +% borrowed from ifpdf.sty. +\ifx\pdfoutput\undefined +\else + \ifx\pdfoutput\relax + \else + \ifcase\pdfoutput + \else + \pdftrue + \fi + \fi +\fi +% +\ifpdf + \input pdfcolor + \pdfcatalog{/PageMode /UseOutlines}% + \def\dopdfimage#1#2#3{% + \def\imagewidth{#2}% + \def\imageheight{#3}% + % without \immediate, pdftex seg faults when the same image is + % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) + \ifnum\pdftexversion < 14 + \immediate\pdfimage + \else + \immediate\pdfximage + \fi + \ifx\empty\imagewidth\else width \imagewidth \fi + \ifx\empty\imageheight\else height \imageheight \fi + \ifnum\pdftexversion<13 + #1.pdf% + \else + {#1.pdf}% + \fi + \ifnum\pdftexversion < 14 \else + \pdfrefximage \pdflastximage + \fi} + \def\pdfmkdest#1{{% + % We have to set dummies so commands such as @code in a section title + % aren't expanded. + \atdummies + \normalturnoffactive + \pdfdest name{#1} xyz% + }} + \def\pdfmkpgn#1{#1} + \let\linkcolor = \Blue % was Cyan, but that seems light? + \def\endlink{\Black\pdfendlink} + % Adding outlines to PDF; macros for calculating structure of outlines + % come from Petr Olsak + \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% + \else \csname#1\endcsname \fi} + \def\advancenumber#1{\tempnum=\expnumber{#1}\relax + \advance\tempnum by 1 + \expandafter\xdef\csname#1\endcsname{\the\tempnum}} + % + % #1 is the section text. #2 is the pdf expression for the number + % of subentries (or empty, for subsubsections). #3 is the node + % text, which might be empty if this toc entry had no + % corresponding node. #4 is the page number. + % + \def\dopdfoutline#1#2#3#4{% + % Generate a link to the node text if that exists; else, use the + % page number. We could generate a destination for the section + % text in the case where a section has no node, but it doesn't + % seem worthwhile, since most documents are normally structured. + \def\pdfoutlinedest{#3}% + \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}\fi + % + \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{#1}% + } + % + \def\pdfmakeoutlines{% + \begingroup + % Thanh's hack / proper braces in bookmarks + \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace + \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace + % + % Read toc silently, to get counts of subentries for \pdfoutline. + \def\numchapentry##1##2##3##4{% + \def\thischapnum{##2}% + \let\thissecnum\empty + \let\thissubsecnum\empty + }% + \def\numsecentry##1##2##3##4{% + \advancenumber{chap\thischapnum}% + \def\thissecnum{##2}% + \let\thissubsecnum\empty + }% + \def\numsubsecentry##1##2##3##4{% + \advancenumber{sec\thissecnum}% + \def\thissubsecnum{##2}% + }% + \def\numsubsubsecentry##1##2##3##4{% + \advancenumber{subsec\thissubsecnum}% + }% + \let\thischapnum\empty + \let\thissecnum\empty + \let\thissubsecnum\empty + % + % use \def rather than \let here because we redefine \chapentry et + % al. a second time, below. + \def\appentry{\numchapentry}% + \def\appsecentry{\numsecentry}% + \def\appsubsecentry{\numsubsecentry}% + \def\appsubsubsecentry{\numsubsubsecentry}% + \def\unnchapentry{\numchapentry}% + \def\unnsecentry{\numsecentry}% + \def\unnsubsecentry{\numsubsecentry}% + \def\unnsubsubsecentry{\numsubsubsecentry}% + \input \jobname.toc + % + % Read toc second time, this time actually producing the outlines. + % The `-' means take the \expnumber as the absolute number of + % subentries, which we calculated on our first read of the .toc above. + % + % We use the node names as the destinations. + \def\numchapentry##1##2##3##4{% + \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}% + \def\numsecentry##1##2##3##4{% + \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}% + \def\numsubsecentry##1##2##3##4{% + \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}% + \def\numsubsubsecentry##1##2##3##4{% count is always zero + \dopdfoutline{##1}{}{##3}{##4}}% + % + % PDF outlines are displayed using system fonts, instead of + % document fonts. Therefore we cannot use special characters, + % since the encoding is unknown. For example, the eogonek from + % Latin 2 (0xea) gets translated to a | character. Info from + % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100. + % + % xx to do this right, we have to translate 8-bit characters to + % their "best" equivalent, based on the @documentencoding. Right + % now, I guess we'll just let the pdf reader have its way. + \indexnofonts + \turnoffactive + \input \jobname.toc + \endgroup + } + % + \def\makelinks #1,{% + \def\params{#1}\def\E{END}% + \ifx\params\E + \let\nextmakelinks=\relax + \else + \let\nextmakelinks=\makelinks + \ifnum\lnkcount>0,\fi + \picknum{#1}% + \startlink attr{/Border [0 0 0]} + goto name{\pdfmkpgn{\the\pgn}}% + \linkcolor #1% + \advance\lnkcount by 1% + \endlink + \fi + \nextmakelinks + } + \def\picknum#1{\expandafter\pn#1} + \def\pn#1{% + \def\p{#1}% + \ifx\p\lbrace + \let\nextpn=\ppn + \else + \let\nextpn=\ppnn + \def\first{#1} + \fi + \nextpn + } + \def\ppn#1{\pgn=#1\gobble} + \def\ppnn{\pgn=\first} + \def\pdfmklnk#1{\lnkcount=0\makelinks #1,END,} + \def\skipspaces#1{\def\PP{#1}\def\D{|}% + \ifx\PP\D\let\nextsp\relax + \else\let\nextsp\skipspaces + \ifx\p\space\else\addtokens{\filename}{\PP}% + \advance\filenamelength by 1 + \fi + \fi + \nextsp} + \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax} + \ifnum\pdftexversion < 14 + \let \startlink \pdfannotlink + \else + \let \startlink \pdfstartlink + \fi + \def\pdfurl#1{% + \begingroup + \normalturnoffactive\def\@{@}% + \makevalueexpandable + \leavevmode\Red + \startlink attr{/Border [0 0 0]}% + user{/Subtype /Link /A << /S /URI /URI (#1) >>}% + \endgroup} + \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} + \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} + \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} + \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} + \def\maketoks{% + \expandafter\poptoks\the\toksA|ENDTOKS|\relax + \ifx\first0\adn0 + \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 + \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 + \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 + \else + \ifnum0=\countA\else\makelink\fi + \ifx\first.\let\next=\done\else + \let\next=\maketoks + \addtokens{\toksB}{\the\toksD} + \ifx\first,\addtokens{\toksB}{\space}\fi + \fi + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi + \next} + \def\makelink{\addtokens{\toksB}% + {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} + \def\pdflink#1{% + \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} + \linkcolor #1\endlink} + \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} +\else + \let\pdfmkdest = \gobble + \let\pdfurl = \gobble + \let\endlink = \relax + \let\linkcolor = \relax + \let\pdfmakeoutlines = \relax +\fi % \ifx\pdfoutput + + +\message{fonts,} + +% Change the current font style to #1, remembering it in \curfontstyle. +% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in +% italics, not bold italics. +% +\def\setfontstyle#1{% + \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. + \csname ten#1\endcsname % change the current font +} + +% Select #1 fonts with the current style. +% +\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname} + +\def\rm{\fam=0 \setfontstyle{rm}} +\def\it{\fam=\itfam \setfontstyle{it}} +\def\sl{\fam=\slfam \setfontstyle{sl}} +\def\bf{\fam=\bffam \setfontstyle{bf}} +\def\tt{\fam=\ttfam \setfontstyle{tt}} + +% Texinfo sort of supports the sans serif font style, which plain TeX does not. +% So we set up a \sf. +\newfam\sffam +\def\sf{\fam=\sffam \setfontstyle{sf}} +\let\li = \sf % Sometimes we call it \li, not \sf. + +% We don't need math for this font style. +\def\ttsl{\setfontstyle{ttsl}} + +% Default leading. +\newdimen\textleading \textleading = 13.2pt + +% Set the baselineskip to #1, and the lineskip and strut size +% correspondingly. There is no deep meaning behind these magic numbers +% used as factors; they just match (closely enough) what Knuth defined. +% +\def\lineskipfactor{.08333} +\def\strutheightpercent{.70833} +\def\strutdepthpercent {.29167} +% +\def\setleading#1{% + \normalbaselineskip = #1\relax + \normallineskip = \lineskipfactor\normalbaselineskip + \normalbaselines + \setbox\strutbox =\hbox{% + \vrule width0pt height\strutheightpercent\baselineskip + depth \strutdepthpercent \baselineskip + }% +} + +% Set the font macro #1 to the font named #2, adding on the +% specified font prefix (normally `cm'). +% #3 is the font's design size, #4 is a scale factor +\def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4} + +% Use cm as the default font prefix. +% To specify the font prefix, you must define \fontprefix +% before you read in texinfo.tex. +\ifx\fontprefix\undefined +\def\fontprefix{cm} +\fi +% Support font families that don't use the same naming scheme as CM. +\def\rmshape{r} +\def\rmbshape{bx} %where the normal face is bold +\def\bfshape{b} +\def\bxshape{bx} +\def\ttshape{tt} +\def\ttbshape{tt} +\def\ttslshape{sltt} +\def\itshape{ti} +\def\itbshape{bxti} +\def\slshape{sl} +\def\slbshape{bxsl} +\def\sfshape{ss} +\def\sfbshape{ss} +\def\scshape{csc} +\def\scbshape{csc} + +% Text fonts (11.2pt, magstep1). +\newcount\mainmagstep +\ifx\bigger\relax + % not really supported. + \mainmagstep=\magstep1 + \setfont\textrm\rmshape{12}{1000} + \setfont\texttt\ttshape{12}{1000} +\else + \mainmagstep=\magstephalf + \setfont\textrm\rmshape{10}{\mainmagstep} + \setfont\texttt\ttshape{10}{\mainmagstep} +\fi +\setfont\textbf\bfshape{10}{\mainmagstep} +\setfont\textit\itshape{10}{\mainmagstep} +\setfont\textsl\slshape{10}{\mainmagstep} +\setfont\textsf\sfshape{10}{\mainmagstep} +\setfont\textsc\scshape{10}{\mainmagstep} +\setfont\textttsl\ttslshape{10}{\mainmagstep} +\font\texti=cmmi10 scaled \mainmagstep +\font\textsy=cmsy10 scaled \mainmagstep + +% A few fonts for @defun names and args. +\setfont\defbf\bfshape{10}{\magstep1} +\setfont\deftt\ttshape{10}{\magstep1} +\setfont\defttsl\ttslshape{10}{\magstep1} +\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} + +% Fonts for indices, footnotes, small examples (9pt). +\setfont\smallrm\rmshape{9}{1000} +\setfont\smalltt\ttshape{9}{1000} +\setfont\smallbf\bfshape{10}{900} +\setfont\smallit\itshape{9}{1000} +\setfont\smallsl\slshape{9}{1000} +\setfont\smallsf\sfshape{9}{1000} +\setfont\smallsc\scshape{10}{900} +\setfont\smallttsl\ttslshape{10}{900} +\font\smalli=cmmi9 +\font\smallsy=cmsy9 + +% Fonts for small examples (8pt). +\setfont\smallerrm\rmshape{8}{1000} +\setfont\smallertt\ttshape{8}{1000} +\setfont\smallerbf\bfshape{10}{800} +\setfont\smallerit\itshape{8}{1000} +\setfont\smallersl\slshape{8}{1000} +\setfont\smallersf\sfshape{8}{1000} +\setfont\smallersc\scshape{10}{800} +\setfont\smallerttsl\ttslshape{10}{800} +\font\smalleri=cmmi8 +\font\smallersy=cmsy8 + +% Fonts for title page (20.4pt): +\setfont\titlerm\rmbshape{12}{\magstep3} +\setfont\titleit\itbshape{10}{\magstep4} +\setfont\titlesl\slbshape{10}{\magstep4} +\setfont\titlett\ttbshape{12}{\magstep3} +\setfont\titlettsl\ttslshape{10}{\magstep4} +\setfont\titlesf\sfbshape{17}{\magstep1} +\let\titlebf=\titlerm +\setfont\titlesc\scbshape{10}{\magstep4} +\font\titlei=cmmi12 scaled \magstep3 +\font\titlesy=cmsy10 scaled \magstep4 +\def\authorrm{\secrm} +\def\authortt{\sectt} + +% Chapter (and unnumbered) fonts (17.28pt). +\setfont\chaprm\rmbshape{12}{\magstep2} +\setfont\chapit\itbshape{10}{\magstep3} +\setfont\chapsl\slbshape{10}{\magstep3} +\setfont\chaptt\ttbshape{12}{\magstep2} +\setfont\chapttsl\ttslshape{10}{\magstep3} +\setfont\chapsf\sfbshape{17}{1000} +\let\chapbf=\chaprm +\setfont\chapsc\scbshape{10}{\magstep3} +\font\chapi=cmmi12 scaled \magstep2 +\font\chapsy=cmsy10 scaled \magstep3 + +% Section fonts (14.4pt). +\setfont\secrm\rmbshape{12}{\magstep1} +\setfont\secit\itbshape{10}{\magstep2} +\setfont\secsl\slbshape{10}{\magstep2} +\setfont\sectt\ttbshape{12}{\magstep1} +\setfont\secttsl\ttslshape{10}{\magstep2} +\setfont\secsf\sfbshape{12}{\magstep1} +\let\secbf\secrm +\setfont\secsc\scbshape{10}{\magstep2} +\font\seci=cmmi12 scaled \magstep1 +\font\secsy=cmsy10 scaled \magstep2 + +% Subsection fonts (13.15pt). +\setfont\ssecrm\rmbshape{12}{\magstephalf} +\setfont\ssecit\itbshape{10}{1315} +\setfont\ssecsl\slbshape{10}{1315} +\setfont\ssectt\ttbshape{12}{\magstephalf} +\setfont\ssecttsl\ttslshape{10}{1315} +\setfont\ssecsf\sfbshape{12}{\magstephalf} +\let\ssecbf\ssecrm +\setfont\ssecsc\scbshape{10}{1315} +\font\sseci=cmmi12 scaled \magstephalf +\font\ssecsy=cmsy10 scaled 1315 + +% Reduced fonts for @acro in text (10pt). +\setfont\reducedrm\rmshape{10}{1000} +\setfont\reducedtt\ttshape{10}{1000} +\setfont\reducedbf\bfshape{10}{1000} +\setfont\reducedit\itshape{10}{1000} +\setfont\reducedsl\slshape{10}{1000} +\setfont\reducedsf\sfshape{10}{1000} +\setfont\reducedsc\scshape{10}{1000} +\setfont\reducedttsl\ttslshape{10}{1000} +\font\reducedi=cmmi10 +\font\reducedsy=cmsy10 + +% In order for the font changes to affect most math symbols and letters, +% we have to define the \textfont of the standard families. Since +% texinfo doesn't allow for producing subscripts and superscripts except +% in the main text, we don't bother to reset \scriptfont and +% \scriptscriptfont (which would also require loading a lot more fonts). +% +\def\resetmathfonts{% + \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy + \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf + \textfont\ttfam=\tentt \textfont\sffam=\tensf +} + +% The font-changing commands redefine the meanings of \tenSTYLE, instead +% of just \STYLE. We do this because \STYLE needs to also set the +% current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire +% \tenSTYLE to set the current font. +% +% Each font-changing command also sets the names \lsize (one size lower) +% and \lllsize (three sizes lower). These relative commands are used in +% the LaTeX logo and acronyms. +% +% This all needs generalizing, badly. +% +\def\textfonts{% + \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl + \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc + \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy + \let\tenttsl=\textttsl + \def\lsize{reduced}\def\lllsize{smaller}% + \resetmathfonts \setleading{\textleading}} +\def\titlefonts{% + \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl + \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc + \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy + \let\tenttsl=\titlettsl + \def\lsize{chap}\def\lllsize{subsec}% + \resetmathfonts \setleading{25pt}} +\def\titlefont#1{{\titlefonts\rm #1}} +\def\chapfonts{% + \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl + \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc + \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl + \def\lsize{sec}\def\lllsize{text}% + \resetmathfonts \setleading{19pt}} +\def\secfonts{% + \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl + \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc + \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy + \let\tenttsl=\secttsl + \def\lsize{subsec}\def\lllsize{reduced}% + \resetmathfonts \setleading{16pt}} +\def\subsecfonts{% + \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl + \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc + \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy + \let\tenttsl=\ssecttsl + \def\lsize{text}\def\lllsize{small}% + \resetmathfonts \setleading{15pt}} +\let\subsubsecfonts = \subsecfonts +\def\reducedfonts{% + \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl + \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc + \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy + \let\tenttsl=\reducedttsl + \def\lsize{small}\def\lllsize{smaller}% + \resetmathfonts \setleading{10.5pt}} +\def\smallfonts{% + \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl + \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc + \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy + \let\tenttsl=\smallttsl + \def\lsize{smaller}\def\lllsize{smaller}% + \resetmathfonts \setleading{10.5pt}} +\def\smallerfonts{% + \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl + \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc + \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy + \let\tenttsl=\smallerttsl + \def\lsize{smaller}\def\lllsize{smaller}% + \resetmathfonts \setleading{9.5pt}} + +% Set the fonts to use with the @small... environments. +\let\smallexamplefonts = \smallfonts + +% About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample +% can fit this many characters: +% 8.5x11=86 smallbook=72 a4=90 a5=69 +% If we use \scriptfonts (8pt), then we can fit this many characters: +% 8.5x11=90+ smallbook=80 a4=90+ a5=77 +% For me, subjectively, the few extra characters that fit aren't worth +% the additional smallness of 8pt. So I'm making the default 9pt. +% +% By the way, for comparison, here's what fits with @example (10pt): +% 8.5x11=71 smallbook=60 a4=75 a5=58 +% +% I wish the USA used A4 paper. +% --karl, 24jan03. + + +% Set up the default fonts, so we can use them for creating boxes. +% +\textfonts \rm + +% Define these so they can be easily changed for other fonts. +\def\angleleft{$\langle$} +\def\angleright{$\rangle$} + +% Count depth in font-changes, for error checks +\newcount\fontdepth \fontdepth=0 + +% Fonts for short table of contents. +\setfont\shortcontrm\rmshape{12}{1000} +\setfont\shortcontbf\bfshape{10}{\magstep1} % no cmb12 +\setfont\shortcontsl\slshape{12}{1000} +\setfont\shortconttt\ttshape{12}{1000} + +%% Add scribe-like font environments, plus @l for inline lisp (usually sans +%% serif) and @ii for TeX italic + +% \smartitalic{ARG} outputs arg in italics, followed by an italic correction +% unless the following character is such as not to need one. +\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else + \ptexslash\fi\fi\fi} +\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx} +\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx} + +% like \smartslanted except unconditionally uses \ttsl. +% @var is set to this for defun arguments. +\def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx} + +% like \smartslanted except unconditionally use \sl. We never want +% ttsl for book titles, do we? +\def\cite#1{{\sl #1}\futurelet\next\smartitalicx} + +\let\i=\smartitalic +\let\var=\smartslanted +\let\dfn=\smartslanted +\let\emph=\smartitalic + +\def\b#1{{\bf #1}} +\let\strong=\b + +% We can't just use \exhyphenpenalty, because that only has effect at +% the end of a paragraph. Restore normal hyphenation at the end of the +% group within which \nohyphenation is presumably called. +% +\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} +\def\restorehyphenation{\hyphenchar\font = `- } + +% Set sfcode to normal for the chars that usually have another value. +% Can't use plain's \frenchspacing because it uses the `\x notation, and +% sometimes \x has an active definition that messes things up. +% +\catcode`@=11 + \def\frenchspacing{% + \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m + \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m + } +\catcode`@=\other + +\def\t#1{% + {\tt \rawbackslash \frenchspacing #1}% + \null +} +\def\samp#1{`\tclose{#1}'\null} +\setfont\keyrm\rmshape{8}{1000} +\font\keysy=cmsy9 +\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% + \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% + \vbox{\hrule\kern-0.4pt + \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% + \kern-0.4pt\hrule}% + \kern-.06em\raise0.4pt\hbox{\angleright}}}} +% The old definition, with no lozenge: +%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null} +\def\ctrl #1{{\tt \rawbackslash \hat}#1} + +% @file, @option are the same as @samp. +\let\file=\samp +\let\option=\samp + +% @code is a modification of @t, +% which makes spaces the same size as normal in the surrounding text. +\def\tclose#1{% + {% + % Change normal interword space to be same as for the current font. + \spaceskip = \fontdimen2\font + % + % Switch to typewriter. + \tt + % + % But `\ ' produces the large typewriter interword space. + \def\ {{\spaceskip = 0pt{} }}% + % + % Turn off hyphenation. + \nohyphenation + % + \rawbackslash + \frenchspacing + #1% + }% + \null +} + +% We *must* turn on hyphenation at `-' and `_' in @code. +% Otherwise, it is too hard to avoid overfull hboxes +% in the Emacs manual, the Library manual, etc. + +% Unfortunately, TeX uses one parameter (\hyphenchar) to control +% both hyphenation at - and hyphenation within words. +% We must therefore turn them both off (\tclose does that) +% and arrange explicitly to hyphenate at a dash. +% -- rms. +{ + \catcode`\-=\active + \catcode`\_=\active + % + \global\def\code{\begingroup + \catcode`\-=\active \let-\codedash + \catcode`\_=\active \let_\codeunder + \codex + } +} + +\def\realdash{-} +\def\codedash{-\discretionary{}{}{}} +\def\codeunder{% + % this is all so @math{@code{var_name}+1} can work. In math mode, _ + % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) + % will therefore expand the active definition of _, which is us + % (inside @code that is), therefore an endless loop. + \ifusingtt{\ifmmode + \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. + \else\normalunderscore \fi + \discretionary{}{}{}}% + {\_}% +} +\def\codex #1{\tclose{#1}\endgroup} + +% @kbd is like @code, except that if the argument is just one @key command, +% then @kbd has no effect. + +% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), +% `example' (@kbd uses ttsl only inside of @example and friends), +% or `code' (@kbd uses normal tty font always). +\parseargdef\kbdinputstyle{% + \def\arg{#1}% + \ifx\arg\worddistinct + \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% + \else\ifx\arg\wordexample + \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% + \else\ifx\arg\wordcode + \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% + \else + \errhelp = \EMsimple + \errmessage{Unknown @kbdinputstyle option `\arg'}% + \fi\fi\fi +} +\def\worddistinct{distinct} +\def\wordexample{example} +\def\wordcode{code} + +% Default is `distinct.' +\kbdinputstyle distinct + +\def\xkey{\key} +\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% +\ifx\one\xkey\ifx\threex\three \key{#2}% +\else{\tclose{\kbdfont\look}}\fi +\else{\tclose{\kbdfont\look}}\fi} + +% For @indicateurl, @env, @command quotes seem unnecessary, so use \code. +\let\indicateurl=\code +\let\env=\code +\let\command=\code + +% @uref (abbreviation for `urlref') takes an optional (comma-separated) +% second argument specifying the text to display and an optional third +% arg as text to display instead of (rather than in addition to) the url +% itself. First (mandatory) arg is the url. Perhaps eventually put in +% a hypertex \special here. +% +\def\uref#1{\douref #1,,,\finish} +\def\douref#1,#2,#3,#4\finish{\begingroup + \unsepspaces + \pdfurl{#1}% + \setbox0 = \hbox{\ignorespaces #3}% + \ifdim\wd0 > 0pt + \unhbox0 % third arg given, show only that + \else + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0 > 0pt + \ifpdf + \unhbox0 % PDF: 2nd arg given, show only it + \else + \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url + \fi + \else + \code{#1}% only url given, so show it + \fi + \fi + \endlink +\endgroup} + +% @url synonym for @uref, since that's how everyone uses it. +% +\let\url=\uref + +% rms does not like angle brackets --karl, 17may97. +% So now @email is just like @uref, unless we are pdf. +% +%\def\email#1{\angleleft{\tt #1}\angleright} +\ifpdf + \def\email#1{\doemail#1,,\finish} + \def\doemail#1,#2,#3\finish{\begingroup + \unsepspaces + \pdfurl{mailto:#1}% + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi + \endlink + \endgroup} +\else + \let\email=\uref +\fi + +% Check if we are currently using a typewriter font. Since all the +% Computer Modern typewriter fonts have zero interword stretch (and +% shrink), and it is reasonable to expect all typewriter fonts to have +% this property, we can check that font parameter. +% +\def\ifmonospace{\ifdim\fontdimen3\font=0pt } + +% Typeset a dimension, e.g., `in' or `pt'. The only reason for the +% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. +% +\def\dmn#1{\thinspace #1} + +\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par} + +% @l was never documented to mean ``switch to the Lisp font'', +% and it is not used as such in any manual I can find. We need it for +% Polish suppressed-l. --karl, 22sep96. +%\def\l#1{{\li #1}\null} + +% Explicit font changes: @r, @sc, undocumented @ii. +\def\r#1{{\rm #1}} % roman font +\def\sc#1{{\smallcaps#1}} % smallcaps font +\def\ii#1{{\it #1}} % italic font + +\def\acronym#1{\doacronym #1,,\finish} +\def\doacronym#1,#2,#3\finish{% + {\selectfonts\lsize #1}% + \def\temp{#2}% + \ifx\temp\empty \else + \space ({\unsepspaces \ignorespaces \temp \unskip})% + \fi +} + +% @pounds{} is a sterling sign, which is in the CM italic font. +% +\def\pounds{{\it\$}} + +% @registeredsymbol - R in a circle. The font for the R should really +% be smaller yet, but lllsize is the best we can do for now. +% Adapted from the plain.tex definition of \copyright. +% +\def\registeredsymbol{% + $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}% + \hfil\crcr\Orb}}% + }$% +} + + +\message{page headings,} + +\newskip\titlepagetopglue \titlepagetopglue = 1.5in +\newskip\titlepagebottomglue \titlepagebottomglue = 2pc + +% First the title page. Must do @settitle before @titlepage. +\newif\ifseenauthor +\newif\iffinishedtitlepage + +% Do an implicit @contents or @shortcontents after @end titlepage if the +% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. +% +\newif\ifsetcontentsaftertitlepage + \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue +\newif\ifsetshortcontentsaftertitlepage + \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue + +\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% + \endgroup\page\hbox{}\page} + +\envdef\titlepage{% + % Open one extra group, as we want to close it in the middle of \Etitlepage. + \begingroup + \parindent=0pt \textfonts + % Leave some space at the very top of the page. + \vglue\titlepagetopglue + % No rule at page bottom unless we print one at the top with @title. + \finishedtitlepagetrue + % + % Most title ``pages'' are actually two pages long, with space + % at the top of the second. We don't want the ragged left on the second. + \let\oldpage = \page + \def\page{% + \iffinishedtitlepage\else + \finishtitlepage + \fi + \let\page = \oldpage + \page + \null + }% +} + +\def\Etitlepage{% + \iffinishedtitlepage\else + \finishtitlepage + \fi + % It is important to do the page break before ending the group, + % because the headline and footline are only empty inside the group. + % If we use the new definition of \page, we always get a blank page + % after the title page, which we certainly don't want. + \oldpage + \endgroup + % + % Need this before the \...aftertitlepage checks so that if they are + % in effect the toc pages will come out with page numbers. + \HEADINGSon + % + % If they want short, they certainly want long too. + \ifsetshortcontentsaftertitlepage + \shortcontents + \contents + \global\let\shortcontents = \relax + \global\let\contents = \relax + \fi + % + \ifsetcontentsaftertitlepage + \contents + \global\let\contents = \relax + \global\let\shortcontents = \relax + \fi +} + +\def\finishtitlepage{% + \vskip4pt \hrule height 2pt width \hsize + \vskip\titlepagebottomglue + \finishedtitlepagetrue +} + +%%% Macros to be used within @titlepage: + +\let\subtitlerm=\tenrm +\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} + +\def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines + \let\tt=\authortt} + +\parseargdef\title{% + \checkenv\titlepage + \leftline{\titlefonts\rm #1} + % print a rule at the page bottom also. + \finishedtitlepagefalse + \vskip4pt \hrule height 4pt width \hsize \vskip4pt +} + +\parseargdef\subtitle{% + \checkenv\titlepage + {\subtitlefont \rightline{#1}}% +} + +% @author should come last, but may come many times. +% It can also be used inside @quotation. +% +\parseargdef\author{% + \def\temp{\quotation}% + \ifx\thisenv\temp + \def\quotationauthor{#1}% printed in \Equotation. + \else + \checkenv\titlepage + \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi + {\authorfont \leftline{#1}}% + \fi +} + + +%%% Set up page headings and footings. + +\let\thispage=\folio + +\newtoks\evenheadline % headline on even pages +\newtoks\oddheadline % headline on odd pages +\newtoks\evenfootline % footline on even pages +\newtoks\oddfootline % footline on odd pages + +% Now make TeX use those variables +\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline + \else \the\evenheadline \fi}} +\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline + \else \the\evenfootline \fi}\HEADINGShook} +\let\HEADINGShook=\relax + +% Commands to set those variables. +% For example, this is what @headings on does +% @evenheading @thistitle|@thispage|@thischapter +% @oddheading @thischapter|@thispage|@thistitle +% @evenfooting @thisfile|| +% @oddfooting ||@thisfile + + +\def\evenheading{\parsearg\evenheadingxxx} +\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish} +\def\evenheadingyyy #1\|#2\|#3\|#4\finish{% +\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\def\oddheading{\parsearg\oddheadingxxx} +\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish} +\def\oddheadingyyy #1\|#2\|#3\|#4\finish{% +\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}% + +\def\evenfooting{\parsearg\evenfootingxxx} +\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish} +\def\evenfootingyyy #1\|#2\|#3\|#4\finish{% +\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\def\oddfooting{\parsearg\oddfootingxxx} +\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish} +\def\oddfootingyyy #1\|#2\|#3\|#4\finish{% + \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% + % + % Leave some space for the footline. Hopefully ok to assume + % @evenfooting will not be used by itself. + \global\advance\pageheight by -\baselineskip + \global\advance\vsize by -\baselineskip +} + +\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} + + +% @headings double turns headings on for double-sided printing. +% @headings single turns headings on for single-sided printing. +% @headings off turns them off. +% @headings on same as @headings double, retained for compatibility. +% @headings after turns on double-sided headings after this page. +% @headings doubleafter turns on double-sided headings after this page. +% @headings singleafter turns on single-sided headings after this page. +% By default, they are off at the start of a document, +% and turned `on' after @end titlepage. + +\def\headings #1 {\csname HEADINGS#1\endcsname} + +\def\HEADINGSoff{% +\global\evenheadline={\hfil} \global\evenfootline={\hfil} +\global\oddheadline={\hfil} \global\oddfootline={\hfil}} +\HEADINGSoff +% When we turn headings on, set the page number to 1. +% For double-sided printing, put current file name in lower left corner, +% chapter name on inside top of right hand pages, document +% title on inside top of left hand pages, and page numbers on outside top +% edge of all pages. +\def\HEADINGSdouble{% +\global\pageno=1 +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\folio\hfil\thistitle}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chapoddpage +} +\let\contentsalignmacro = \chappager + +% For single-sided printing, chapter title goes across top left of page, +% page number on top right. +\def\HEADINGSsingle{% +\global\pageno=1 +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\thischapter\hfil\folio}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chappager +} +\def\HEADINGSon{\HEADINGSdouble} + +\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} +\let\HEADINGSdoubleafter=\HEADINGSafter +\def\HEADINGSdoublex{% +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\folio\hfil\thistitle}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chapoddpage +} + +\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} +\def\HEADINGSsinglex{% +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\thischapter\hfil\folio}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chappager +} + +% Subroutines used in generating headings +% This produces Day Month Year style of output. +% Only define if not already defined, in case a txi-??.tex file has set +% up a different format (e.g., txi-cs.tex does this). +\ifx\today\undefined +\def\today{% + \number\day\space + \ifcase\month + \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr + \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug + \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec + \fi + \space\number\year} +\fi + +% @settitle line... specifies the title of the document, for headings. +% It generates no output of its own. +\def\thistitle{\putwordNoTitle} +\def\settitle{\parsearg{\gdef\thistitle}} + + +\message{tables,} +% Tables -- @table, @ftable, @vtable, @item(x). + +% default indentation of table text +\newdimen\tableindent \tableindent=.8in +% default indentation of @itemize and @enumerate text +\newdimen\itemindent \itemindent=.3in +% margin between end of table item and start of table text. +\newdimen\itemmargin \itemmargin=.1in + +% used internally for \itemindent minus \itemmargin +\newdimen\itemmax + +% Note @table, @ftable, and @vtable define @item, @itemx, etc., with +% these defs. +% They also define \itemindex +% to index the item name in whatever manner is desired (perhaps none). + +\newif\ifitemxneedsnegativevskip + +\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} + +\def\internalBitem{\smallbreak \parsearg\itemzzz} +\def\internalBitemx{\itemxpar \parsearg\itemzzz} + +\def\itemzzz #1{\begingroup % + \advance\hsize by -\rightskip + \advance\hsize by -\tableindent + \setbox0=\hbox{\itemindicate{#1}}% + \itemindex{#1}% + \nobreak % This prevents a break before @itemx. + % + % If the item text does not fit in the space we have, put it on a line + % by itself, and do not allow a page break either before or after that + % line. We do not start a paragraph here because then if the next + % command is, e.g., @kindex, the whatsit would get put into the + % horizontal list on a line by itself, resulting in extra blank space. + \ifdim \wd0>\itemmax + % + % Make this a paragraph so we get the \parskip glue and wrapping, + % but leave it ragged-right. + \begingroup + \advance\leftskip by-\tableindent + \advance\hsize by\tableindent + \advance\rightskip by0pt plus1fil + \leavevmode\unhbox0\par + \endgroup + % + % We're going to be starting a paragraph, but we don't want the + % \parskip glue -- logically it's part of the @item we just started. + \nobreak \vskip-\parskip + % + % Stop a page break at the \parskip glue coming up. (Unfortunately + % we can't prevent a possible page break at the following + % \baselineskip glue.) However, if what follows is an environment + % such as @example, there will be no \parskip glue; then + % the negative vskip we just would cause the example and the item to + % crash together. So we use this bizarre value of 10001 as a signal + % to \aboveenvbreak to insert \parskip glue after all. + % (Possibly there are other commands that could be followed by + % @example which need the same treatment, but not section titles; or + % maybe section titles are the only special case and they should be + % penalty 10001...) + \penalty 10001 + \endgroup + \itemxneedsnegativevskipfalse + \else + % The item text fits into the space. Start a paragraph, so that the + % following text (if any) will end up on the same line. + \noindent + % Do this with kerns and \unhbox so that if there is a footnote in + % the item text, it can migrate to the main vertical list and + % eventually be printed. + \nobreak\kern-\tableindent + \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 + \unhbox0 + \nobreak\kern\dimen0 + \endgroup + \itemxneedsnegativevskiptrue + \fi +} + +\def\item{\errmessage{@item while not in a list environment}} +\def\itemx{\errmessage{@itemx while not in a list environment}} + +% @table, @ftable, @vtable. +\envdef\table{% + \let\itemindex\gobble + \tablex +} +\envdef\ftable{% + \def\itemindex ##1{\doind {fn}{\code{##1}}}% + \tablex +} +\envdef\vtable{% + \def\itemindex ##1{\doind {vr}{\code{##1}}}% + \tablex +} +\def\tablex#1{% + \def\itemindicate{#1}% + \parsearg\tabley +} +\def\tabley#1{% + {% + \makevalueexpandable + \edef\temp{\noexpand\tablez #1\space\space\space}% + \expandafter + }\temp \endtablez +} +\def\tablez #1 #2 #3 #4\endtablez{% + \aboveenvbreak + \ifnum 0#1>0 \advance \leftskip by #1\mil \fi + \ifnum 0#2>0 \tableindent=#2\mil \fi + \ifnum 0#3>0 \advance \rightskip by #3\mil \fi + \itemmax=\tableindent + \advance \itemmax by -\itemmargin + \advance \leftskip by \tableindent + \exdentamount=\tableindent + \parindent = 0pt + \parskip = \smallskipamount + \ifdim \parskip=0pt \parskip=2pt \fi + \let\item = \internalBitem + \let\itemx = \internalBitemx +} +\def\Etable{\endgraf\afterenvbreak} +\let\Eftable\Etable +\let\Evtable\Etable +\let\Eitemize\Etable +\let\Eenumerate\Etable + +% This is the counter used by @enumerate, which is really @itemize + +\newcount \itemno + +\envdef\itemize{\parsearg\doitemize} + +\def\doitemize#1{% + \aboveenvbreak + \itemmax=\itemindent + \advance\itemmax by -\itemmargin + \advance\leftskip by \itemindent + \exdentamount=\itemindent + \parindent=0pt + \parskip=\smallskipamount + \ifdim\parskip=0pt \parskip=2pt \fi + \def\itemcontents{#1}% + % @itemize with no arg is equivalent to @itemize @bullet. + \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi + \let\item=\itemizeitem +} + +% Definition of @item while inside @itemize and @enumerate. +% +\def\itemizeitem{% + \advance\itemno by 1 % for enumerations + {\let\par=\endgraf \smallbreak}% reasonable place to break + {% + % If the document has an @itemize directly after a section title, a + % \nobreak will be last on the list, and \sectionheading will have + % done a \vskip-\parskip. In that case, we don't want to zero + % parskip, or the item text will crash with the heading. On the + % other hand, when there is normal text preceding the item (as there + % usually is), we do want to zero parskip, or there would be too much + % space. In that case, we won't have a \nobreak before. At least + % that's the theory. + \ifnum\lastpenalty<10000 \parskip=0in \fi + \noindent + \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% + \vadjust{\penalty 1200}}% not good to break after first line of item. + \flushcr +} + +% \splitoff TOKENS\endmark defines \first to be the first token in +% TOKENS, and \rest to be the remainder. +% +\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% + +% Allow an optional argument of an uppercase letter, lowercase letter, +% or number, to specify the first label in the enumerated list. No +% argument is the same as `1'. +% +\envparseargdef\enumerate{\enumeratey #1 \endenumeratey} +\def\enumeratey #1 #2\endenumeratey{% + % If we were given no argument, pretend we were given `1'. + \def\thearg{#1}% + \ifx\thearg\empty \def\thearg{1}\fi + % + % Detect if the argument is a single token. If so, it might be a + % letter. Otherwise, the only valid thing it can be is a number. + % (We will always have one token, because of the test we just made. + % This is a good thing, since \splitoff doesn't work given nothing at + % all -- the first parameter is undelimited.) + \expandafter\splitoff\thearg\endmark + \ifx\rest\empty + % Only one token in the argument. It could still be anything. + % A ``lowercase letter'' is one whose \lccode is nonzero. + % An ``uppercase letter'' is one whose \lccode is both nonzero, and + % not equal to itself. + % Otherwise, we assume it's a number. + % + % We need the \relax at the end of the \ifnum lines to stop TeX from + % continuing to look for a . + % + \ifnum\lccode\expandafter`\thearg=0\relax + \numericenumerate % a number (we hope) + \else + % It's a letter. + \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax + \lowercaseenumerate % lowercase letter + \else + \uppercaseenumerate % uppercase letter + \fi + \fi + \else + % Multiple tokens in the argument. We hope it's a number. + \numericenumerate + \fi +} + +% An @enumerate whose labels are integers. The starting integer is +% given in \thearg. +% +\def\numericenumerate{% + \itemno = \thearg + \startenumeration{\the\itemno}% +} + +% The starting (lowercase) letter is in \thearg. +\def\lowercaseenumerate{% + \itemno = \expandafter`\thearg + \startenumeration{% + % Be sure we're not beyond the end of the alphabet. + \ifnum\itemno=0 + \errmessage{No more lowercase letters in @enumerate; get a bigger + alphabet}% + \fi + \char\lccode\itemno + }% +} + +% The starting (uppercase) letter is in \thearg. +\def\uppercaseenumerate{% + \itemno = \expandafter`\thearg + \startenumeration{% + % Be sure we're not beyond the end of the alphabet. + \ifnum\itemno=0 + \errmessage{No more uppercase letters in @enumerate; get a bigger + alphabet} + \fi + \char\uccode\itemno + }% +} + +% Call \doitemize, adding a period to the first argument and supplying the +% common last two arguments. Also subtract one from the initial value in +% \itemno, since @item increments \itemno. +% +\def\startenumeration#1{% + \advance\itemno by -1 + \doitemize{#1.}\flushcr +} + +% @alphaenumerate and @capsenumerate are abbreviations for giving an arg +% to @enumerate. +% +\def\alphaenumerate{\enumerate{a}} +\def\capsenumerate{\enumerate{A}} +\def\Ealphaenumerate{\Eenumerate} +\def\Ecapsenumerate{\Eenumerate} + + +% @multitable macros +% Amy Hendrickson, 8/18/94, 3/6/96 +% +% @multitable ... @end multitable will make as many columns as desired. +% Contents of each column will wrap at width given in preamble. Width +% can be specified either with sample text given in a template line, +% or in percent of \hsize, the current width of text on page. + +% Table can continue over pages but will only break between lines. + +% To make preamble: +% +% Either define widths of columns in terms of percent of \hsize: +% @multitable @columnfractions .25 .3 .45 +% @item ... +% +% Numbers following @columnfractions are the percent of the total +% current hsize to be used for each column. You may use as many +% columns as desired. + + +% Or use a template: +% @multitable {Column 1 template} {Column 2 template} {Column 3 template} +% @item ... +% using the widest term desired in each column. + +% Each new table line starts with @item, each subsequent new column +% starts with @tab. Empty columns may be produced by supplying @tab's +% with nothing between them for as many times as empty columns are needed, +% ie, @tab@tab@tab will produce two empty columns. + +% @item, @tab do not need to be on their own lines, but it will not hurt +% if they are. + +% Sample multitable: + +% @multitable {Column 1 template} {Column 2 template} {Column 3 template} +% @item first col stuff @tab second col stuff @tab third col +% @item +% first col stuff +% @tab +% second col stuff +% @tab +% third col +% @item first col stuff @tab second col stuff +% @tab Many paragraphs of text may be used in any column. +% +% They will wrap at the width determined by the template. +% @item@tab@tab This will be in third column. +% @end multitable + +% Default dimensions may be reset by user. +% @multitableparskip is vertical space between paragraphs in table. +% @multitableparindent is paragraph indent in table. +% @multitablecolmargin is horizontal space to be left between columns. +% @multitablelinespace is space to leave between table items, baseline +% to baseline. +% 0pt means it depends on current normal line spacing. +% +\newskip\multitableparskip +\newskip\multitableparindent +\newdimen\multitablecolspace +\newskip\multitablelinespace +\multitableparskip=0pt +\multitableparindent=6pt +\multitablecolspace=12pt +\multitablelinespace=0pt + +% Macros used to set up halign preamble: +% +\let\endsetuptable\relax +\def\xendsetuptable{\endsetuptable} +\let\columnfractions\relax +\def\xcolumnfractions{\columnfractions} +\newif\ifsetpercent + +% #1 is the @columnfraction, usually a decimal number like .5, but might +% be just 1. We just use it, whatever it is. +% +\def\pickupwholefraction#1 {% + \global\advance\colcount by 1 + \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}% + \setuptable +} + +\newcount\colcount +\def\setuptable#1{% + \def\firstarg{#1}% + \ifx\firstarg\xendsetuptable + \let\go = \relax + \else + \ifx\firstarg\xcolumnfractions + \global\setpercenttrue + \else + \ifsetpercent + \let\go\pickupwholefraction + \else + \global\advance\colcount by 1 + \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a + % separator; typically that is always in the input, anyway. + \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% + \fi + \fi + \ifx\go\pickupwholefraction + % Put the argument back for the \pickupwholefraction call, so + % we'll always have a period there to be parsed. + \def\go{\pickupwholefraction#1}% + \else + \let\go = \setuptable + \fi% + \fi + \go +} + +% multitable-only commands. +% +% @headitem starts a heading row, which we typeset in bold. +% Assignments have to be global since we are inside the implicit group +% of an alignment entry. Note that \everycr resets \everytab. +\def\headitem{\checkenv\multitable \crcr \global\everytab={\bf}\the\everytab}% +% +% A \tab used to include \hskip1sp. But then the space in a template +% line is not enough. That is bad. So let's go back to just `&' until +% we encounter the problem it was intended to solve again. +% --karl, nathan@acm.org, 20apr99. +\def\tab{\checkenv\multitable &\the\everytab}% + +% @multitable ... @end multitable definitions: +% +\newtoks\everytab % insert after every tab. +% +\envdef\multitable{% + \vskip\parskip + \startsavinginserts + % + % @item within a multitable starts a normal row. + \let\item\crcr + % + \tolerance=9500 + \hbadness=9500 + \setmultitablespacing + \parskip=\multitableparskip + \parindent=\multitableparindent + \overfullrule=0pt + \global\colcount=0 + % + \everycr = {% + \noalign{% + \global\everytab={}% + \global\colcount=0 % Reset the column counter. + % Check for saved footnotes, etc. + \checkinserts + % Keeps underfull box messages off when table breaks over pages. + %\filbreak + % Maybe so, but it also creates really weird page breaks when the + % table breaks over pages. Wouldn't \vfil be better? Wait until the + % problem manifests itself, so it can be fixed for real --karl. + }% + }% + % + \parsearg\domultitable +} +\def\domultitable#1{% + % To parse everything between @multitable and @item: + \setuptable#1 \endsetuptable + % + % This preamble sets up a generic column definition, which will + % be used as many times as user calls for columns. + % \vtop will set a single line and will also let text wrap and + % continue for many paragraphs if desired. + \halign\bgroup &% + \global\advance\colcount by 1 + \multistrut + \vtop{% + % Use the current \colcount to find the correct column width: + \hsize=\expandafter\csname col\the\colcount\endcsname + % + % In order to keep entries from bumping into each other + % we will add a \leftskip of \multitablecolspace to all columns after + % the first one. + % + % If a template has been used, we will add \multitablecolspace + % to the width of each template entry. + % + % If the user has set preamble in terms of percent of \hsize we will + % use that dimension as the width of the column, and the \leftskip + % will keep entries from bumping into each other. Table will start at + % left margin and final column will justify at right margin. + % + % Make sure we don't inherit \rightskip from the outer environment. + \rightskip=0pt + \ifnum\colcount=1 + % The first column will be indented with the surrounding text. + \advance\hsize by\leftskip + \else + \ifsetpercent \else + % If user has not set preamble in terms of percent of \hsize + % we will advance \hsize by \multitablecolspace. + \advance\hsize by \multitablecolspace + \fi + % In either case we will make \leftskip=\multitablecolspace: + \leftskip=\multitablecolspace + \fi + % Ignoring space at the beginning and end avoids an occasional spurious + % blank line, when TeX decides to break the line at the space before the + % box from the multistrut, so the strut ends up on a line by itself. + % For example: + % @multitable @columnfractions .11 .89 + % @item @code{#} + % @tab Legal holiday which is valid in major parts of the whole country. + % Is automatically provided with highlighting sequences respectively + % marking characters. + \noindent\ignorespaces##\unskip\multistrut + }\cr +} +\def\Emultitable{% + \crcr + \egroup % end the \halign + \global\setpercentfalse +} + +\def\setmultitablespacing{% test to see if user has set \multitablelinespace. +% If so, do nothing. If not, give it an appropriate dimension based on +% current baselineskip. +\ifdim\multitablelinespace=0pt +\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip +\global\advance\multitablelinespace by-\ht0 +%% strut to put in table in case some entry doesn't have descenders, +%% to keep lines equally spaced +\let\multistrut = \strut +\else +%% FIXME: what is \box0 supposed to be? +\gdef\multistrut{\vrule height\multitablelinespace depth\dp0 +width0pt\relax} \fi +%% Test to see if parskip is larger than space between lines of +%% table. If not, do nothing. +%% If so, set to same dimension as multitablelinespace. +\ifdim\multitableparskip>\multitablelinespace +\global\multitableparskip=\multitablelinespace +\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller + %% than skip between lines in the table. +\fi% +\ifdim\multitableparskip=0pt +\global\multitableparskip=\multitablelinespace +\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller + %% than skip between lines in the table. +\fi} + + +\message{conditionals,} + +% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext, +% @ifnotxml always succeed. They currently do nothing; we don't +% attempt to check whether the conditionals are properly nested. But we +% have to remember that they are conditionals, so that @end doesn't +% attempt to close an environment group. +% +\def\makecond#1{% + \expandafter\let\csname #1\endcsname = \relax + \expandafter\let\csname iscond.#1\endcsname = 1 +} +\makecond{iftex} +\makecond{ifnotdocbook} +\makecond{ifnothtml} +\makecond{ifnotinfo} +\makecond{ifnotplaintext} +\makecond{ifnotxml} + +% Ignore @ignore, @ifhtml, @ifinfo, and the like. +% +\def\direntry{\doignore{direntry}} +\def\documentdescription{\doignore{documentdescription}} +\def\docbook{\doignore{docbook}} +\def\html{\doignore{html}} +\def\ifdocbook{\doignore{ifdocbook}} +\def\ifhtml{\doignore{ifhtml}} +\def\ifinfo{\doignore{ifinfo}} +\def\ifnottex{\doignore{ifnottex}} +\def\ifplaintext{\doignore{ifplaintext}} +\def\ifxml{\doignore{ifxml}} +\def\ignore{\doignore{ignore}} +\def\menu{\doignore{menu}} +\def\xml{\doignore{xml}} + +% Ignore text until a line `@end #1', keeping track of nested conditionals. +% +% A count to remember the depth of nesting. +\newcount\doignorecount + +\def\doignore#1{\begingroup + % Scan in ``verbatim'' mode: + \catcode`\@ = \other + \catcode`\{ = \other + \catcode`\} = \other + % + % Make sure that spaces turn into tokens that match what \doignoretext wants. + \spaceisspace + % + % Count number of #1's that we've seen. + \doignorecount = 0 + % + % Swallow text until we reach the matching `@end #1'. + \dodoignore {#1}% +} + +{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source. + \obeylines % + % + \gdef\dodoignore#1{% + % #1 contains the string `ifinfo'. + % + % Define a command to find the next `@end #1', which must be on a line + % by itself. + \long\def\doignoretext##1^^M@end #1{\doignoretextyyy##1^^M@#1\_STOP_}% + % And this command to find another #1 command, at the beginning of a + % line. (Otherwise, we would consider a line `@c @ifset', for + % example, to count as an @ifset for nesting.) + \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}% + % + % And now expand that command. + \obeylines % + \doignoretext ^^M% + }% +} + +\def\doignoreyyy#1{% + \def\temp{#1}% + \ifx\temp\empty % Nothing found. + \let\next\doignoretextzzz + \else % Found a nested condition, ... + \advance\doignorecount by 1 + \let\next\doignoretextyyy % ..., look for another. + % If we're here, #1 ends with ^^M\ifinfo (for example). + \fi + \next #1% the token \_STOP_ is present just after this macro. +} + +% We have to swallow the remaining "\_STOP_". +% +\def\doignoretextzzz#1{% + \ifnum\doignorecount = 0 % We have just found the outermost @end. + \let\next\enddoignore + \else % Still inside a nested condition. + \advance\doignorecount by -1 + \let\next\doignoretext % Look for the next @end. + \fi + \next +} + +% Finish off ignored text. +\def\enddoignore{\endgroup\ignorespaces} + + +% @set VAR sets the variable VAR to an empty value. +% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. +% +% Since we want to separate VAR from REST-OF-LINE (which might be +% empty), we can't just use \parsearg; we have to insert a space of our +% own to delimit the rest of the line, and then take it out again if we +% didn't need it. +% We rely on the fact that \parsearg sets \catcode`\ =10. +% +\parseargdef\set{\setyyy#1 \endsetyyy} +\def\setyyy#1 #2\endsetyyy{% + {% + \makevalueexpandable + \def\temp{#2}% + \edef\next{\gdef\makecsname{SET#1}}% + \ifx\temp\empty + \next{}% + \else + \setzzz#2\endsetzzz + \fi + }% +} +% Remove the trailing space \setxxx inserted. +\def\setzzz#1 \endsetzzz{\next{#1}} + +% @clear VAR clears (i.e., unsets) the variable VAR. +% +\parseargdef\clear{% + {% + \makevalueexpandable + \global\expandafter\let\csname SET#1\endcsname=\relax + }% +} + +% @value{foo} gets the text saved in variable foo. +\def\value{\begingroup\makevalueexpandable\valuexxx} +\def\valuexxx#1{\expandablevalue{#1}\endgroup} +{ + \catcode`\- = \active \catcode`\_ = \active + % + \gdef\makevalueexpandable{% + \let\value = \expandablevalue + % We don't want these characters active, ... + \catcode`\-=\other \catcode`\_=\other + % ..., but we might end up with active ones in the argument if + % we're called from @code, as @code{@value{foo-bar_}}, though. + % So \let them to their normal equivalents. + \let-\realdash \let_\normalunderscore + } +} + +% We have this subroutine so that we can handle at least some @value's +% properly in indexes (we call \makevalueexpandable in \indexdummies). +% The command has to be fully expandable (if the variable is set), since +% the result winds up in the index file. This means that if the +% variable's value contains other Texinfo commands, it's almost certain +% it will fail (although perhaps we could fix that with sufficient work +% to do a one-level expansion on the result, instead of complete). +% +\def\expandablevalue#1{% + \expandafter\ifx\csname SET#1\endcsname\relax + {[No value for ``#1'']}% + \message{Variable `#1', used in @value, is not set.}% + \else + \csname SET#1\endcsname + \fi +} + +% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined +% with @set. +% +% To get special treatment of `@end ifset,' call \makeond and the redefine. +% +\makecond{ifset} +\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} +\def\doifset#1#2{% + {% + \makevalueexpandable + \let\next=\empty + \expandafter\ifx\csname SET#2\endcsname\relax + #1% If not set, redefine \next. + \fi + \expandafter + }\next +} +\def\ifsetfail{\doignore{ifset}} + +% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been +% defined with @set, or has been undefined with @clear. +% +% The `\else' inside the `\doifset' parameter is a trick to reuse the +% above code: if the variable is not set, do nothing, if it is set, +% then redefine \next to \ifclearfail. +% +\makecond{ifclear} +\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}} +\def\ifclearfail{\doignore{ifclear}} + +% @dircategory CATEGORY -- specify a category of the dir file +% which this file should belong to. Ignore this in TeX. +\let\dircategory=\comment + +% @defininfoenclose. +\let\definfoenclose=\comment + + +\message{indexing,} +% Index generation facilities + +% Define \newwrite to be identical to plain tex's \newwrite +% except not \outer, so it can be used within \newindex. +{\catcode`\@=11 +\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}} + +% \newindex {foo} defines an index named foo. +% It automatically defines \fooindex such that +% \fooindex ...rest of line... puts an entry in the index foo. +% It also defines \fooindfile to be the number of the output channel for +% the file that accumulates this index. The file's extension is foo. +% The name of an index should be no more than 2 characters long +% for the sake of vms. +% +\def\newindex#1{% + \iflinks + \expandafter\newwrite \csname#1indfile\endcsname + \openout \csname#1indfile\endcsname \jobname.#1 % Open the file + \fi + \expandafter\xdef\csname#1index\endcsname{% % Define @#1index + \noexpand\doindex{#1}} +} + +% @defindex foo == \newindex{foo} +% +\def\defindex{\parsearg\newindex} + +% Define @defcodeindex, like @defindex except put all entries in @code. +% +\def\defcodeindex{\parsearg\newcodeindex} +% +\def\newcodeindex#1{% + \iflinks + \expandafter\newwrite \csname#1indfile\endcsname + \openout \csname#1indfile\endcsname \jobname.#1 + \fi + \expandafter\xdef\csname#1index\endcsname{% + \noexpand\docodeindex{#1}}% +} + + +% @synindex foo bar makes index foo feed into index bar. +% Do this instead of @defindex foo if you don't want it as a separate index. +% +% @syncodeindex foo bar similar, but put all entries made for index foo +% inside @code. +% +\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} +\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} + +% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), +% #3 the target index (bar). +\def\dosynindex#1#2#3{% + % Only do \closeout if we haven't already done it, else we'll end up + % closing the target index. + \expandafter \ifx\csname donesynindex#2\endcsname \undefined + % The \closeout helps reduce unnecessary open files; the limit on the + % Acorn RISC OS is a mere 16 files. + \expandafter\closeout\csname#2indfile\endcsname + \expandafter\let\csname\donesynindex#2\endcsname = 1 + \fi + % redefine \fooindfile: + \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname + \expandafter\let\csname#2indfile\endcsname=\temp + % redefine \fooindex: + \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% +} + +% Define \doindex, the driver for all \fooindex macros. +% Argument #1 is generated by the calling \fooindex macro, +% and it is "foo", the name of the index. + +% \doindex just uses \parsearg; it calls \doind for the actual work. +% This is because \doind is more useful to call from other macros. + +% There is also \dosubind {index}{topic}{subtopic} +% which makes an entry in a two-level index such as the operation index. + +\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} +\def\singleindexer #1{\doind{\indexname}{#1}} + +% like the previous two, but they put @code around the argument. +\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} +\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} + +% Take care of Texinfo commands that can appear in an index entry. +% Since there are some commands we want to expand, and others we don't, +% we have to laboriously prevent expansion for those that we don't. +% +\def\indexdummies{% + \def\@{@}% change to @@ when we switch to @ as escape char in index files. + \def\ {\realbackslash\space }% + % Need these in case \tex is in effect and \{ is a \delimiter again. + % But can't use \lbracecmd and \rbracecmd because texindex assumes + % braces and backslashes are used only as delimiters. + \let\{ = \mylbrace + \let\} = \myrbrace + % + % \definedummyword defines \#1 as \realbackslash #1\space, thus + % effectively preventing its expansion. This is used only for control + % words, not control letters, because the \space would be incorrect + % for control characters, but is needed to separate the control word + % from whatever follows. + % + % For control letters, we have \definedummyletter, which omits the + % space. + % + % These can be used both for control words that take an argument and + % those that do not. If it is followed by {arg} in the input, then + % that will dutifully get written to the index (or wherever). + % + \def\definedummyword##1{% + \expandafter\def\csname ##1\endcsname{\realbackslash ##1\space}% + }% + \def\definedummyletter##1{% + \expandafter\def\csname ##1\endcsname{\realbackslash ##1}% + }% + % + % Do the redefinitions. + \commondummies +} + +% For the aux file, @ is the escape character. So we want to redefine +% everything using @ instead of \realbackslash. When everything uses +% @, this will be simpler. +% +\def\atdummies{% + \def\@{@@}% + \def\ {@ }% + \let\{ = \lbraceatcmd + \let\} = \rbraceatcmd + % + % (See comments in \indexdummies.) + \def\definedummyword##1{% + \expandafter\def\csname ##1\endcsname{@##1\space}% + }% + \def\definedummyletter##1{% + \expandafter\def\csname ##1\endcsname{@##1}% + }% + % + % Do the redefinitions. + \commondummies +} + +% Called from \indexdummies and \atdummies. \definedummyword and +% \definedummyletter must be defined first. +% +\def\commondummies{% + % + \normalturnoffactive + % + \commondummiesnofonts + % + \definedummyletter{_}% + % + % Non-English letters. + \definedummyword{AA}% + \definedummyword{AE}% + \definedummyword{L}% + \definedummyword{OE}% + \definedummyword{O}% + \definedummyword{aa}% + \definedummyword{ae}% + \definedummyword{l}% + \definedummyword{oe}% + \definedummyword{o}% + \definedummyword{ss}% + \definedummyword{exclamdown}% + \definedummyword{questiondown}% + \definedummyword{ordf}% + \definedummyword{ordm}% + % + % Although these internal commands shouldn't show up, sometimes they do. + \definedummyword{bf}% + \definedummyword{gtr}% + \definedummyword{hat}% + \definedummyword{less}% + \definedummyword{sf}% + \definedummyword{sl}% + \definedummyword{tclose}% + \definedummyword{tt}% + % + \definedummyword{LaTeX}% + \definedummyword{TeX}% + % + % Assorted special characters. + \definedummyword{bullet}% + \definedummyword{copyright}% + \definedummyword{registeredsymbol}% + \definedummyword{dots}% + \definedummyword{enddots}% + \definedummyword{equiv}% + \definedummyword{error}% + \definedummyword{expansion}% + \definedummyword{minus}% + \definedummyword{pounds}% + \definedummyword{point}% + \definedummyword{print}% + \definedummyword{result}% + % + % Handle some cases of @value -- where it does not contain any + % (non-fully-expandable) commands. + \makevalueexpandable + % + % Normal spaces, not active ones. + \unsepspaces + % + % No macro expansion. + \turnoffmacros +} + +% \commondummiesnofonts: common to \commondummies and \indexnofonts. +% +% Better have this without active chars. +{ + \catcode`\~=\other + \gdef\commondummiesnofonts{% + % Control letters and accents. + \definedummyletter{!}% + \definedummyletter{"}% + \definedummyletter{'}% + \definedummyletter{*}% + \definedummyletter{,}% + \definedummyletter{.}% + \definedummyletter{/}% + \definedummyletter{:}% + \definedummyletter{=}% + \definedummyletter{?}% + \definedummyletter{^}% + \definedummyletter{`}% + \definedummyletter{~}% + \definedummyword{u}% + \definedummyword{v}% + \definedummyword{H}% + \definedummyword{dotaccent}% + \definedummyword{ringaccent}% + \definedummyword{tieaccent}% + \definedummyword{ubaraccent}% + \definedummyword{udotaccent}% + \definedummyword{dotless}% + % + % Texinfo font commands. + \definedummyword{b}% + \definedummyword{i}% + \definedummyword{r}% + \definedummyword{sc}% + \definedummyword{t}% + % + % Commands that take arguments. + \definedummyword{acronym}% + \definedummyword{cite}% + \definedummyword{code}% + \definedummyword{command}% + \definedummyword{dfn}% + \definedummyword{emph}% + \definedummyword{env}% + \definedummyword{file}% + \definedummyword{kbd}% + \definedummyword{key}% + \definedummyword{math}% + \definedummyword{option}% + \definedummyword{samp}% + \definedummyword{strong}% + \definedummyword{tie}% + \definedummyword{uref}% + \definedummyword{url}% + \definedummyword{var}% + \definedummyword{verb}% + \definedummyword{w}% + } +} + +% \indexnofonts is used when outputting the strings to sort the index +% by, and when constructing control sequence names. It eliminates all +% control sequences and just writes whatever the best ASCII sort string +% would be for a given command (usually its argument). +% +\def\indexnofonts{% + \def\definedummyword##1{% + \expandafter\let\csname ##1\endcsname\asis + }% + % We can just ignore the accent commands and other control letters. + \def\definedummyletter##1{% + \expandafter\def\csname ##1\endcsname{}% + }% + % + \commondummiesnofonts + % + % Don't no-op \tt, since it isn't a user-level command + % and is used in the definitions of the active chars like <, >, |, etc. + % Likewise with the other plain tex font commands. + %\let\tt=\asis + % + \def\ { }% + \def\@{@}% + % how to handle braces? + \def\_{\normalunderscore}% + % + % Non-English letters. + \def\AA{AA}% + \def\AE{AE}% + \def\L{L}% + \def\OE{OE}% + \def\O{O}% + \def\aa{aa}% + \def\ae{ae}% + \def\l{l}% + \def\oe{oe}% + \def\o{o}% + \def\ss{ss}% + \def\exclamdown{!}% + \def\questiondown{?}% + \def\ordf{a}% + \def\ordm{o}% + % + \def\LaTeX{LaTeX}% + \def\TeX{TeX}% + % + % Assorted special characters. + % (The following {} will end up in the sort string, but that's ok.) + \def\bullet{bullet}% + \def\copyright{copyright}% + \def\registeredsymbol{R}% + \def\dots{...}% + \def\enddots{...}% + \def\equiv{==}% + \def\error{error}% + \def\expansion{==>}% + \def\minus{-}% + \def\pounds{pounds}% + \def\point{.}% + \def\print{-|}% + \def\result{=>}% +} + +\let\indexbackslash=0 %overridden during \printindex. +\let\SETmarginindex=\relax % put index entries in margin (undocumented)? + +% Most index entries go through here, but \dosubind is the general case. +% #1 is the index name, #2 is the entry text. +\def\doind#1#2{\dosubind{#1}{#2}{}} + +% Workhorse for all \fooindexes. +% #1 is name of index, #2 is stuff to put there, #3 is subentry -- +% empty if called from \doind, as we usually are (the main exception +% is with most defuns, which call us directly). +% +\def\dosubind#1#2#3{% + \iflinks + {% + % Store the main index entry text (including the third arg). + \toks0 = {#2}% + % If third arg is present, precede it with a space. + \def\thirdarg{#3}% + \ifx\thirdarg\empty \else + \toks0 = \expandafter{\the\toks0 \space #3}% + \fi + % + \edef\writeto{\csname#1indfile\endcsname}% + % + \ifvmode + \dosubindsanitize + \else + \dosubindwrite + \fi + }% + \fi +} + +% Write the entry in \toks0 to the index file: +% +\def\dosubindwrite{% + % Put the index entry in the margin if desired. + \ifx\SETmarginindex\relax\else + \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}% + \fi + % + % Remember, we are within a group. + \indexdummies % Must do this here, since \bf, etc expand at this stage + \escapechar=`\\ + \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now + % so it will be output as is; and it will print as backslash. + % + % Process the index entry with all font commands turned off, to + % get the string to sort by. + {\indexnofonts + \edef\temp{\the\toks0}% need full expansion + \xdef\indexsorttmp{\temp}% + }% + % + % Set up the complete index entry, with both the sort key and + % the original text, including any font commands. We write + % three arguments to \entry to the .?? file (four in the + % subentry case), texindex reduces to two when writing the .??s + % sorted result. + \edef\temp{% + \write\writeto{% + \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% + }% + \temp +} + +% Take care of unwanted page breaks: +% +% If a skip is the last thing on the list now, preserve it +% by backing up by \lastskip, doing the \write, then inserting +% the skip again. Otherwise, the whatsit generated by the +% \write will make \lastskip zero. The result is that sequences +% like this: +% @end defun +% @tindex whatever +% @defun ... +% will have extra space inserted, because the \medbreak in the +% start of the @defun won't see the skip inserted by the @end of +% the previous defun. +% +% But don't do any of this if we're not in vertical mode. We +% don't want to do a \vskip and prematurely end a paragraph. +% +% Avoid page breaks due to these extra skips, too. +% +% But wait, there is a catch there: +% We'll have to check whether \lastskip is zero skip. \ifdim is not +% sufficient for this purpose, as it ignores stretch and shrink parts +% of the skip. The only way seems to be to check the textual +% representation of the skip. +% +% The following is almost like \def\zeroskipmacro{0.0pt} except that +% the ``p'' and ``t'' characters have catcode \other, not 11 (letter). +% +\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} +% +% ..., ready, GO: +% +\def\dosubindsanitize{% + % \lastskip and \lastpenalty cannot both be nonzero simultaneously. + \skip0 = \lastskip + \edef\lastskipmacro{\the\lastskip}% + \count255 = \lastpenalty + % + % If \lastskip is nonzero, that means the last item was a + % skip. And since a skip is discardable, that means this + % -\skip0 glue we're inserting is preceded by a + % non-discardable item, therefore it is not a potential + % breakpoint, therefore no \nobreak needed. + \ifx\lastskipmacro\zeroskipmacro + \else + \vskip-\skip0 + \fi + % + \dosubindwrite + % + \ifx\lastskipmacro\zeroskipmacro + % if \lastskip was zero, perhaps the last item was a + % penalty, and perhaps it was >=10000, e.g., a \nobreak. + % In that case, we want to re-insert the penalty; since we + % just inserted a non-discardable item, any following glue + % (such as a \parskip) would be a breakpoint. For example: + % @deffn deffn-whatever + % @vindex index-whatever + % Description. + % would allow a break between the index-whatever whatsit + % and the "Description." paragraph. + \ifnum\count255>9999 \nobreak \fi + \else + % On the other hand, if we had a nonzero \lastskip, + % this make-up glue would be preceded by a non-discardable item + % (the whatsit from the \write), so we must insert a \nobreak. + \nobreak\vskip\skip0 + \fi +} + +% The index entry written in the file actually looks like +% \entry {sortstring}{page}{topic} +% or +% \entry {sortstring}{page}{topic}{subtopic} +% The texindex program reads in these files and writes files +% containing these kinds of lines: +% \initial {c} +% before the first topic whose initial is c +% \entry {topic}{pagelist} +% for a topic that is used without subtopics +% \primary {topic} +% for the beginning of a topic that is used with subtopics +% \secondary {subtopic}{pagelist} +% for each subtopic. + +% Define the user-accessible indexing commands +% @findex, @vindex, @kindex, @cindex. + +\def\findex {\fnindex} +\def\kindex {\kyindex} +\def\cindex {\cpindex} +\def\vindex {\vrindex} +\def\tindex {\tpindex} +\def\pindex {\pgindex} + +\def\cindexsub {\begingroup\obeylines\cindexsub} +{\obeylines % +\gdef\cindexsub "#1" #2^^M{\endgroup % +\dosubind{cp}{#2}{#1}}} + +% Define the macros used in formatting output of the sorted index material. + +% @printindex causes a particular index (the ??s file) to get printed. +% It does not print any chapter heading (usually an @unnumbered). +% +\parseargdef\printindex{\begingroup + \dobreak \chapheadingskip{10000}% + % + \smallfonts \rm + \tolerance = 9500 + \everypar = {}% don't want the \kern\-parindent from indentation suppression. + % + % See if the index file exists and is nonempty. + % Change catcode of @ here so that if the index file contains + % \initial {@} + % as its first line, TeX doesn't complain about mismatched braces + % (because it thinks @} is a control sequence). + \catcode`\@ = 11 + \openin 1 \jobname.#1s + \ifeof 1 + % \enddoublecolumns gets confused if there is no text in the index, + % and it loses the chapter title and the aux file entries for the + % index. The easiest way to prevent this problem is to make sure + % there is some text. + \putwordIndexNonexistent + \else + % + % If the index file exists but is empty, then \openin leaves \ifeof + % false. We have to make TeX try to read something from the file, so + % it can discover if there is anything in it. + \read 1 to \temp + \ifeof 1 + \putwordIndexIsEmpty + \else + % Index files are almost Texinfo source, but we use \ as the escape + % character. It would be better to use @, but that's too big a change + % to make right now. + \def\indexbackslash{\backslashcurfont}% + \catcode`\\ = 0 + \escapechar = `\\ + \begindoublecolumns + \input \jobname.#1s + \enddoublecolumns + \fi + \fi + \closein 1 +\endgroup} + +% These macros are used by the sorted index file itself. +% Change them to control the appearance of the index. + +\def\initial#1{{% + % Some minor font changes for the special characters. + \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt + % + % Remove any glue we may have, we'll be inserting our own. + \removelastskip + % + % We like breaks before the index initials, so insert a bonus. + \penalty -300 + % + % Typeset the initial. Making this add up to a whole number of + % baselineskips increases the chance of the dots lining up from column + % to column. It still won't often be perfect, because of the stretch + % we need before each entry, but it's better. + % + % No shrink because it confuses \balancecolumns. + \vskip 1.67\baselineskip plus .5\baselineskip + \leftline{\secbf #1}% + \vskip .33\baselineskip plus .1\baselineskip + % + % Do our best not to break after the initial. + \nobreak +}} + +% \entry typesets a paragraph consisting of the text (#1), dot leaders, and +% then page number (#2) flushed to the right margin. It is used for index +% and table of contents entries. The paragraph is indented by \leftskip. +% +% A straightforward implementation would start like this: +% \def\entry#1#2{... +% But this frozes the catcodes in the argument, and can cause problems to +% @code, which sets - active. This problem was fixed by a kludge--- +% ``-'' was active throughout whole index, but this isn't really right. +% +% The right solution is to prevent \entry from swallowing the whole text. +% --kasal, 21nov03 +\def\entry{% + \begingroup + % + % Start a new paragraph if necessary, so our assignments below can't + % affect previous text. + \par + % + % Do not fill out the last line with white space. + \parfillskip = 0in + % + % No extra space above this paragraph. + \parskip = 0in + % + % Do not prefer a separate line ending with a hyphen to fewer lines. + \finalhyphendemerits = 0 + % + % \hangindent is only relevant when the entry text and page number + % don't both fit on one line. In that case, bob suggests starting the + % dots pretty far over on the line. Unfortunately, a large + % indentation looks wrong when the entry text itself is broken across + % lines. So we use a small indentation and put up with long leaders. + % + % \hangafter is reset to 1 (which is the value we want) at the start + % of each paragraph, so we need not do anything with that. + \hangindent = 2em + % + % When the entry text needs to be broken, just fill out the first line + % with blank space. + \rightskip = 0pt plus1fil + % + % A bit of stretch before each entry for the benefit of balancing + % columns. + \vskip 0pt plus1pt + % + % Swallow the left brace of the text (first parameter): + \afterassignment\doentry + \let\temp = +} +\def\doentry{% + \bgroup % Instead of the swallowed brace. + \noindent + \aftergroup\finishentry + % And now comes the text of the entry. +} +\def\finishentry#1{% + % #1 is the page number. + % + % The following is kludged to not output a line of dots in the index if + % there are no page numbers. The next person who breaks this will be + % cursed by a Unix daemon. + \def\tempa{{\rm }}% + \def\tempb{#1}% + \edef\tempc{\tempa}% + \edef\tempd{\tempb}% + \ifx\tempc\tempd + \ % + \else + % + % If we must, put the page number on a line of its own, and fill out + % this line with blank space. (The \hfil is overwhelmed with the + % fill leaders glue in \indexdotfill if the page number does fit.) + \hfil\penalty50 + \null\nobreak\indexdotfill % Have leaders before the page number. + % + % The `\ ' here is removed by the implicit \unskip that TeX does as + % part of (the primitive) \par. Without it, a spurious underfull + % \hbox ensues. + \ifpdf + \pdfgettoks#1.% + \ \the\toksA + \else + \ #1% + \fi + \fi + \par + \endgroup +} + +% Like \dotfill except takes at least 1 em. +\def\indexdotfill{\cleaders + \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill} + +\def\primary #1{\line{#1\hfil}} + +\newskip\secondaryindent \secondaryindent=0.5cm +\def\secondary#1#2{{% + \parfillskip=0in + \parskip=0in + \hangindent=1in + \hangafter=1 + \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill + \ifpdf + \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. + \else + #2 + \fi + \par +}} + +% Define two-column mode, which we use to typeset indexes. +% Adapted from the TeXbook, page 416, which is to say, +% the manmac.tex format used to print the TeXbook itself. +\catcode`\@=11 + +\newbox\partialpage +\newdimen\doublecolumnhsize + +\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns + % Grab any single-column material above us. + \output = {% + % + % Here is a possibility not foreseen in manmac: if we accumulate a + % whole lot of material, we might end up calling this \output + % routine twice in a row (see the doublecol-lose test, which is + % essentially a couple of indexes with @setchapternewpage off). In + % that case we just ship out what is in \partialpage with the normal + % output routine. Generally, \partialpage will be empty when this + % runs and this will be a no-op. See the indexspread.tex test case. + \ifvoid\partialpage \else + \onepageout{\pagecontents\partialpage}% + \fi + % + \global\setbox\partialpage = \vbox{% + % Unvbox the main output page. + \unvbox\PAGE + \kern-\topskip \kern\baselineskip + }% + }% + \eject % run that output routine to set \partialpage + % + % Use the double-column output routine for subsequent pages. + \output = {\doublecolumnout}% + % + % Change the page size parameters. We could do this once outside this + % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 + % format, but then we repeat the same computation. Repeating a couple + % of assignments once per index is clearly meaningless for the + % execution time, so we may as well do it in one place. + % + % First we halve the line length, less a little for the gutter between + % the columns. We compute the gutter based on the line length, so it + % changes automatically with the paper format. The magic constant + % below is chosen so that the gutter has the same value (well, +-<1pt) + % as it did when we hard-coded it. + % + % We put the result in a separate register, \doublecolumhsize, so we + % can restore it in \pagesofar, after \hsize itself has (potentially) + % been clobbered. + % + \doublecolumnhsize = \hsize + \advance\doublecolumnhsize by -.04154\hsize + \divide\doublecolumnhsize by 2 + \hsize = \doublecolumnhsize + % + % Double the \vsize as well. (We don't need a separate register here, + % since nobody clobbers \vsize.) + \vsize = 2\vsize +} + +% The double-column output routine for all double-column pages except +% the last. +% +\def\doublecolumnout{% + \splittopskip=\topskip \splitmaxdepth=\maxdepth + % Get the available space for the double columns -- the normal + % (undoubled) page height minus any material left over from the + % previous page. + \dimen@ = \vsize + \divide\dimen@ by 2 + \advance\dimen@ by -\ht\partialpage + % + % box0 will be the left-hand column, box2 the right. + \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ + \onepageout\pagesofar + \unvbox255 + \penalty\outputpenalty +} +% +% Re-output the contents of the output page -- any previous material, +% followed by the two boxes we just split, in box0 and box2. +\def\pagesofar{% + \unvbox\partialpage + % + \hsize = \doublecolumnhsize + \wd0=\hsize \wd2=\hsize + \hbox to\pagewidth{\box0\hfil\box2}% +} +% +% All done with double columns. +\def\enddoublecolumns{% + \output = {% + % Split the last of the double-column material. Leave it on the + % current page, no automatic page break. + \balancecolumns + % + % If we end up splitting too much material for the current page, + % though, there will be another page break right after this \output + % invocation ends. Having called \balancecolumns once, we do not + % want to call it again. Therefore, reset \output to its normal + % definition right away. (We hope \balancecolumns will never be + % called on to balance too much material, but if it is, this makes + % the output somewhat more palatable.) + \global\output = {\onepageout{\pagecontents\PAGE}}% + }% + \eject + \endgroup % started in \begindoublecolumns + % + % \pagegoal was set to the doubled \vsize above, since we restarted + % the current page. We're now back to normal single-column + % typesetting, so reset \pagegoal to the normal \vsize (after the + % \endgroup where \vsize got restored). + \pagegoal = \vsize +} +% +% Called at the end of the double column material. +\def\balancecolumns{% + \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. + \dimen@ = \ht0 + \advance\dimen@ by \topskip + \advance\dimen@ by-\baselineskip + \divide\dimen@ by 2 % target to split to + %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% + \splittopskip = \topskip + % Loop until we get a decent breakpoint. + {% + \vbadness = 10000 + \loop + \global\setbox3 = \copy0 + \global\setbox1 = \vsplit3 to \dimen@ + \ifdim\ht3>\dimen@ + \global\advance\dimen@ by 1pt + \repeat + }% + %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% + \setbox0=\vbox to\dimen@{\unvbox1}% + \setbox2=\vbox to\dimen@{\unvbox3}% + % + \pagesofar +} +\catcode`\@ = \other + + +\message{sectioning,} +% Chapters, sections, etc. + +% \unnumberedno is an oxymoron, of course. But we count the unnumbered +% sections so that we can refer to them unambiguously in the pdf +% outlines by their "section number". We avoid collisions with chapter +% numbers by starting them at 10000. (If a document ever has 10000 +% chapters, we're in trouble anyway, I'm sure.) +\newcount\unnumberedno \unnumberedno = 10000 +\newcount\chapno +\newcount\secno \secno=0 +\newcount\subsecno \subsecno=0 +\newcount\subsubsecno \subsubsecno=0 + +% This counter is funny since it counts through charcodes of letters A, B, ... +\newcount\appendixno \appendixno = `\@ +% +% \def\appendixletter{\char\the\appendixno} +% We do the following ugly conditional instead of the above simple +% construct for the sake of pdftex, which needs the actual +% letter in the expansion, not just typeset. +% +\def\appendixletter{% + \ifnum\appendixno=`A A% + \else\ifnum\appendixno=`B B% + \else\ifnum\appendixno=`C C% + \else\ifnum\appendixno=`D D% + \else\ifnum\appendixno=`E E% + \else\ifnum\appendixno=`F F% + \else\ifnum\appendixno=`G G% + \else\ifnum\appendixno=`H H% + \else\ifnum\appendixno=`I I% + \else\ifnum\appendixno=`J J% + \else\ifnum\appendixno=`K K% + \else\ifnum\appendixno=`L L% + \else\ifnum\appendixno=`M M% + \else\ifnum\appendixno=`N N% + \else\ifnum\appendixno=`O O% + \else\ifnum\appendixno=`P P% + \else\ifnum\appendixno=`Q Q% + \else\ifnum\appendixno=`R R% + \else\ifnum\appendixno=`S S% + \else\ifnum\appendixno=`T T% + \else\ifnum\appendixno=`U U% + \else\ifnum\appendixno=`V V% + \else\ifnum\appendixno=`W W% + \else\ifnum\appendixno=`X X% + \else\ifnum\appendixno=`Y Y% + \else\ifnum\appendixno=`Z Z% + % The \the is necessary, despite appearances, because \appendixletter is + % expanded while writing the .toc file. \char\appendixno is not + % expandable, thus it is written literally, thus all appendixes come out + % with the same letter (or @) in the toc without it. + \else\char\the\appendixno + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} + +% Each @chapter defines this as the name of the chapter. +% page headings and footings can use it. @section does likewise. +% However, they are not reliable, because we don't use marks. +\def\thischapter{} +\def\thissection{} + +\newcount\absseclevel % used to calculate proper heading level +\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count + +% @raisesections: treat @section as chapter, @subsection as section, etc. +\def\raisesections{\global\advance\secbase by -1} +\let\up=\raisesections % original BFox name + +% @lowersections: treat @chapter as section, @section as subsection, etc. +\def\lowersections{\global\advance\secbase by 1} +\let\down=\lowersections % original BFox name + +% we only have subsub. +\chardef\maxseclevel = 3 +% +% A numbered section within an unnumbered changes to unnumbered too. +% To achive this, remember the "biggest" unnum. sec. we are currently in: +\chardef\unmlevel = \maxseclevel +% +% Trace whether the current chapter is an appendix or not: +% \chapheadtype is "N" or "A", unnumbered chapters are ignored. +\def\chapheadtype{N} + +% Choose a heading macro +% #1 is heading type +% #2 is heading level +% #3 is text for heading +\def\genhead#1#2#3{% + % Compute the abs. sec. level: + \absseclevel=#2 + \advance\absseclevel by \secbase + % Make sure \absseclevel doesn't fall outside the range: + \ifnum \absseclevel < 0 + \absseclevel = 0 + \else + \ifnum \absseclevel > 3 + \absseclevel = 3 + \fi + \fi + % The heading type: + \def\headtype{#1}% + \if \headtype U% + \ifnum \absseclevel < \unmlevel + \chardef\unmlevel = \absseclevel + \fi + \else + % Check for appendix sections: + \ifnum \absseclevel = 0 + \edef\chapheadtype{\headtype}% + \else + \if \headtype A\if \chapheadtype N% + \errmessage{@appendix... within a non-appendix chapter}% + \fi\fi + \fi + % Check for numbered within unnumbered: + \ifnum \absseclevel > \unmlevel + \def\headtype{U}% + \else + \chardef\unmlevel = 3 + \fi + \fi + % Now print the heading: + \if \headtype U% + \ifcase\absseclevel + \unnumberedzzz{#3}% + \or \unnumberedseczzz{#3}% + \or \unnumberedsubseczzz{#3}% + \or \unnumberedsubsubseczzz{#3}% + \fi + \else + \if \headtype A% + \ifcase\absseclevel + \appendixzzz{#3}% + \or \appendixsectionzzz{#3}% + \or \appendixsubseczzz{#3}% + \or \appendixsubsubseczzz{#3}% + \fi + \else + \ifcase\absseclevel + \chapterzzz{#3}% + \or \seczzz{#3}% + \or \numberedsubseczzz{#3}% + \or \numberedsubsubseczzz{#3}% + \fi + \fi + \fi + \suppressfirstparagraphindent +} + +% an interface: +\def\numhead{\genhead N} +\def\apphead{\genhead A} +\def\unnmhead{\genhead U} + +% @chapter, @appendix, @unnumbered. Increment top-level counter, reset +% all lower-level sectioning counters to zero. +% +% Also set \chaplevelprefix, which we prepend to @float sequence numbers +% (e.g., figures), q.v. By default (before any chapter), that is empty. +\let\chaplevelprefix = \empty +% +\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz +\def\chapterzzz#1{% + % section resetting is \global in case the chapter is in a group, such + % as an @include file. + \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 + \global\advance\chapno by 1 + % + % Used for \float. + \gdef\chaplevelprefix{\the\chapno.}% + \resetallfloatnos + % + \message{\putwordChapter\space \the\chapno}% + % + % Write the actual heading. + \chapmacro{#1}{Ynumbered}{\the\chapno}% + % + % So @section and the like are numbered underneath this chapter. + \global\let\section = \numberedsec + \global\let\subsection = \numberedsubsec + \global\let\subsubsection = \numberedsubsubsec +} + +\outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz +\def\appendixzzz#1{% + \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 + \global\advance\appendixno by 1 + \gdef\chaplevelprefix{\appendixletter.}% + \resetallfloatnos + % + \def\appendixnum{\putwordAppendix\space \appendixletter}% + \message{\appendixnum}% + % + \chapmacro{#1}{Yappendix}{\appendixletter}% + % + \global\let\section = \appendixsec + \global\let\subsection = \appendixsubsec + \global\let\subsubsection = \appendixsubsubsec +} + +\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz +\def\unnumberedzzz#1{% + \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 + \global\advance\unnumberedno by 1 + % + % Since an unnumbered has no number, no prefix for figures. + \global\let\chaplevelprefix = \empty + \resetallfloatnos + % + % This used to be simply \message{#1}, but TeX fully expands the + % argument to \message. Therefore, if #1 contained @-commands, TeX + % expanded them. For example, in `@unnumbered The @cite{Book}', TeX + % expanded @cite (which turns out to cause errors because \cite is meant + % to be executed, not expanded). + % + % Anyway, we don't want the fully-expanded definition of @cite to appear + % as a result of the \message, we just want `@cite' itself. We use + % \the to achieve this: TeX expands \the only once, + % simply yielding the contents of . (We also do this for + % the toc entries.) + \toks0 = {#1}% + \message{(\the\toks0)}% + % + \chapmacro{#1}{Ynothing}{\the\unnumberedno}% + % + \global\let\section = \unnumberedsec + \global\let\subsection = \unnumberedsubsec + \global\let\subsubsection = \unnumberedsubsubsec +} + +% @centerchap is like @unnumbered, but the heading is centered. +\outer\parseargdef\centerchap{% + % Well, we could do the following in a group, but that would break + % an assumption that \chapmacro is called at the outermost level. + % Thus we are safer this way: --kasal, 24feb04 + \let\centerparametersmaybe = \centerparameters + \unnmhead0{#1}% + \let\centerparametersmaybe = \relax +} + +% @top is like @unnumbered. +\let\top\unnumbered + +% Sections. +\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz +\def\seczzz#1{% + \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 + \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% +} + +\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz +\def\appendixsectionzzz#1{% + \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 + \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% +} +\let\appendixsec\appendixsection + +\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz +\def\unnumberedseczzz#1{% + \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 + \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% +} + +% Subsections. +\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz +\def\numberedsubseczzz#1{% + \global\subsubsecno=0 \global\advance\subsecno by 1 + \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% +} + +\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz +\def\appendixsubseczzz#1{% + \global\subsubsecno=0 \global\advance\subsecno by 1 + \sectionheading{#1}{subsec}{Yappendix}% + {\appendixletter.\the\secno.\the\subsecno}% +} + +\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz +\def\unnumberedsubseczzz#1{% + \global\subsubsecno=0 \global\advance\subsecno by 1 + \sectionheading{#1}{subsec}{Ynothing}% + {\the\unnumberedno.\the\secno.\the\subsecno}% +} + +% Subsubsections. +\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz +\def\numberedsubsubseczzz#1{% + \global\advance\subsubsecno by 1 + \sectionheading{#1}{subsubsec}{Ynumbered}% + {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% +} + +\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz +\def\appendixsubsubseczzz#1{% + \global\advance\subsubsecno by 1 + \sectionheading{#1}{subsubsec}{Yappendix}% + {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% +} + +\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz +\def\unnumberedsubsubseczzz#1{% + \global\advance\subsubsecno by 1 + \sectionheading{#1}{subsubsec}{Ynothing}% + {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% +} + +% These macros control what the section commands do, according +% to what kind of chapter we are in (ordinary, appendix, or unnumbered). +% Define them by default for a numbered chapter. +\let\section = \numberedsec +\let\subsection = \numberedsubsec +\let\subsubsection = \numberedsubsubsec + +% Define @majorheading, @heading and @subheading + +% NOTE on use of \vbox for chapter headings, section headings, and such: +% 1) We use \vbox rather than the earlier \line to permit +% overlong headings to fold. +% 2) \hyphenpenalty is set to 10000 because hyphenation in a +% heading is obnoxious; this forbids it. +% 3) Likewise, headings look best if no \parindent is used, and +% if justification is not attempted. Hence \raggedright. + + +\def\majorheading{% + {\advance\chapheadingskip by 10pt \chapbreak }% + \parsearg\chapheadingzzz +} + +\def\chapheading{\chapbreak \parsearg\chapheadingzzz} +\def\chapheadingzzz#1{% + {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\raggedright + \rm #1\hfill}}% + \bigskip \par\penalty 200\relax + \suppressfirstparagraphindent +} + +% @heading, @subheading, @subsubheading. +\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} + \suppressfirstparagraphindent} +\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} + \suppressfirstparagraphindent} +\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} + \suppressfirstparagraphindent} + +% These macros generate a chapter, section, etc. heading only +% (including whitespace, linebreaking, etc. around it), +% given all the information in convenient, parsed form. + +%%% Args are the skip and penalty (usually negative) +\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} + +%%% Define plain chapter starts, and page on/off switching for it +% Parameter controlling skip before chapter headings (if needed) + +\newskip\chapheadingskip + +\def\chapbreak{\dobreak \chapheadingskip {-4000}} +\def\chappager{\par\vfill\supereject} +\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi} + +\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} + +\def\CHAPPAGoff{% +\global\let\contentsalignmacro = \chappager +\global\let\pchapsepmacro=\chapbreak +\global\let\pagealignmacro=\chappager} + +\def\CHAPPAGon{% +\global\let\contentsalignmacro = \chappager +\global\let\pchapsepmacro=\chappager +\global\let\pagealignmacro=\chappager +\global\def\HEADINGSon{\HEADINGSsingle}} + +\def\CHAPPAGodd{% +\global\let\contentsalignmacro = \chapoddpage +\global\let\pchapsepmacro=\chapoddpage +\global\let\pagealignmacro=\chapoddpage +\global\def\HEADINGSon{\HEADINGSdouble}} + +\CHAPPAGon + +% Chapter opening. +% +% #1 is the text, #2 is the section type (Ynumbered, Ynothing, +% Yappendix, Yomitfromtoc), #3 the chapter number. +% +% To test against our argument. +\def\Ynothingkeyword{Ynothing} +\def\Yomitfromtockeyword{Yomitfromtoc} +\def\Yappendixkeyword{Yappendix} +% +\def\chapmacro#1#2#3{% + \pchapsepmacro + {% + \chapfonts \rm + % + % Have to define \thissection before calling \donoderef, because the + % xref code eventually uses it. On the other hand, it has to be called + % after \pchapsepmacro, or the headline will change too soon. + \gdef\thissection{#1}% + \gdef\thischaptername{#1}% + % + % Only insert the separating space if we have a chapter/appendix + % number, and don't print the unnumbered ``number''. + \def\temptype{#2}% + \ifx\temptype\Ynothingkeyword + \setbox0 = \hbox{}% + \def\toctype{unnchap}% + \def\thischapter{#1}% + \else\ifx\temptype\Yomitfromtockeyword + \setbox0 = \hbox{}% contents like unnumbered, but no toc entry + \def\toctype{omit}% + \xdef\thischapter{}% + \else\ifx\temptype\Yappendixkeyword + \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% + \def\toctype{app}% + % We don't substitute the actual chapter name into \thischapter + % because we don't want its macros evaluated now. And we don't + % use \thissection because that changes with each section. + % + \xdef\thischapter{\putwordAppendix{} \appendixletter: + \noexpand\thischaptername}% + \else + \setbox0 = \hbox{#3\enspace}% + \def\toctype{numchap}% + \xdef\thischapter{\putwordChapter{} \the\chapno: + \noexpand\thischaptername}% + \fi\fi\fi + % + % Write the toc entry for this chapter. Must come before the + % \donoderef, because we include the current node name in the toc + % entry, and \donoderef resets it to empty. + \writetocentry{\toctype}{#1}{#3}% + % + % For pdftex, we have to write out the node definition (aka, make + % the pdfdest) after any page break, but before the actual text has + % been typeset. If the destination for the pdf outline is after the + % text, then jumping from the outline may wind up with the text not + % being visible, for instance under high magnification. + \donoderef{#2}% + % + % Typeset the actual heading. + \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright + \hangindent=\wd0 \centerparametersmaybe + \unhbox0 #1\par}% + }% + \nobreak\bigskip % no page break after a chapter title + \nobreak +} + +% @centerchap -- centered and unnumbered. +\let\centerparametersmaybe = \relax +\def\centerparameters{% + \advance\rightskip by 3\rightskip + \leftskip = \rightskip + \parfillskip = 0pt +} + + +% I don't think this chapter style is supported any more, so I'm not +% updating it with the new noderef stuff. We'll see. --karl, 11aug03. +% +\def\setchapterstyle #1 {\csname CHAPF#1\endcsname} +% +\def\unnchfopen #1{% +\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\raggedright + \rm #1\hfill}}\bigskip \par\nobreak +} +\def\chfopen #1#2{\chapoddpage {\chapfonts +\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% +\par\penalty 5000 % +} +\def\centerchfopen #1{% +\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt + \hfill {\rm #1}\hfill}}\bigskip \par\nobreak +} +\def\CHAPFopen{% + \global\let\chapmacro=\chfopen + \global\let\centerchapmacro=\centerchfopen} + + +% Section titles. These macros combine the section number parts and +% call the generic \sectionheading to do the printing. +% +\newskip\secheadingskip +\def\secheadingbreak{\dobreak \secheadingskip{-1000}} + +% Subsection titles. +\newskip\subsecheadingskip +\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} + +% Subsubsection titles. +\def\subsubsecheadingskip{\subsecheadingskip} +\def\subsubsecheadingbreak{\subsecheadingbreak} + + +% Print any size, any type, section title. +% +% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is +% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the +% section number. +% +\def\sectionheading#1#2#3#4{% + {% + % Switch to the right set of fonts. + \csname #2fonts\endcsname \rm + % + % Insert space above the heading. + \csname #2headingbreak\endcsname + % + % Only insert the space after the number if we have a section number. + \def\sectionlevel{#2}% + \def\temptype{#3}% + % + \ifx\temptype\Ynothingkeyword + \setbox0 = \hbox{}% + \def\toctype{unn}% + \gdef\thissection{#1}% + \else\ifx\temptype\Yomitfromtockeyword + % for @headings -- no section number, don't include in toc, + % and don't redefine \thissection. + \setbox0 = \hbox{}% + \def\toctype{omit}% + \let\sectionlevel=\empty + \else\ifx\temptype\Yappendixkeyword + \setbox0 = \hbox{#4\enspace}% + \def\toctype{app}% + \gdef\thissection{#1}% + \else + \setbox0 = \hbox{#4\enspace}% + \def\toctype{num}% + \gdef\thissection{#1}% + \fi\fi\fi + % + % Write the toc entry (before \donoderef). See comments in \chfplain. + \writetocentry{\toctype\sectionlevel}{#1}{#4}% + % + % Write the node reference (= pdf destination for pdftex). + % Again, see comments in \chfplain. + \donoderef{#3}% + % + % Output the actual section heading. + \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright + \hangindent=\wd0 % zero if no section number + \unhbox0 #1}% + }% + % Add extra space after the heading -- half of whatever came above it. + % Don't allow stretch, though. + \kern .5 \csname #2headingskip\endcsname + % + % Do not let the kern be a potential breakpoint, as it would be if it + % was followed by glue. + \nobreak + % + % We'll almost certainly start a paragraph next, so don't let that + % glue accumulate. (Not a breakpoint because it's preceded by a + % discardable item.) + \vskip-\parskip + % + % This \nobreak is purely so the last item on the list is a \penalty + % of 10000. This is so other code, for instance \parsebodycommon, can + % check for and avoid allowing breakpoints. Otherwise, it would + % insert a valid breakpoint between: + % @section sec-whatever + % @deffn def-whatever + \nobreak +} + + +\message{toc,} +% Table of contents. +\newwrite\tocfile + +% Write an entry to the toc file, opening it if necessary. +% Called from @chapter, etc. +% +% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} +% We append the current node name (if any) and page number as additional +% arguments for the \{chap,sec,...}entry macros which will eventually +% read this. The node name is used in the pdf outlines as the +% destination to jump to. +% +% We open the .toc file for writing here instead of at @setfilename (or +% any other fixed time) so that @contents can be anywhere in the document. +% But if #1 is `omit', then we don't do anything. This is used for the +% table of contents chapter openings themselves. +% +\newif\iftocfileopened +\def\omitkeyword{omit}% +% +\def\writetocentry#1#2#3{% + \edef\writetoctype{#1}% + \ifx\writetoctype\omitkeyword \else + \iftocfileopened\else + \immediate\openout\tocfile = \jobname.toc + \global\tocfileopenedtrue + \fi + % + \iflinks + \toks0 = {#2}% + \toks2 = \expandafter{\lastnode}% + \edef\temp{\write\tocfile{\realbackslash #1entry{\the\toks0}{#3}% + {\the\toks2}{\noexpand\folio}}}% + \temp + \fi + \fi + % + % Tell \shipout to create a pdf destination on each page, if we're + % writing pdf. These are used in the table of contents. We can't + % just write one on every page because the title pages are numbered + % 1 and 2 (the page numbers aren't printed), and so are the first + % two pages of the document. Thus, we'd have two destinations named + % `1', and two named `2'. + \ifpdf \global\pdfmakepagedesttrue \fi +} + +\newskip\contentsrightmargin \contentsrightmargin=1in +\newcount\savepageno +\newcount\lastnegativepageno \lastnegativepageno = -1 + +% Prepare to read what we've written to \tocfile. +% +\def\startcontents#1{% + % If @setchapternewpage on, and @headings double, the contents should + % start on an odd page, unlike chapters. Thus, we maintain + % \contentsalignmacro in parallel with \pagealignmacro. + % From: Torbjorn Granlund + \contentsalignmacro + \immediate\closeout\tocfile + % + % Don't need to put `Contents' or `Short Contents' in the headline. + % It is abundantly clear what they are. + \def\thischapter{}% + \chapmacro{#1}{Yomitfromtoc}{}% + % + \savepageno = \pageno + \begingroup % Set up to handle contents files properly. + \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11 + % We can't do this, because then an actual ^ in a section + % title fails, e.g., @chapter ^ -- exponentiation. --karl, 9jul97. + %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi + \raggedbottom % Worry more about breakpoints than the bottom. + \advance\hsize by -\contentsrightmargin % Don't use the full line length. + % + % Roman numerals for page numbers. + \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi +} + + +% Normal (long) toc. +\def\contents{% + \startcontents{\putwordTOC}% + \openin 1 \jobname.toc + \ifeof 1 \else + \input \jobname.toc + \fi + \vfill \eject + \contentsalignmacro % in case @setchapternewpage odd is in effect + \ifeof 1 \else + \pdfmakeoutlines + \fi + \closein 1 + \endgroup + \lastnegativepageno = \pageno + \global\pageno = \savepageno +} + +% And just the chapters. +\def\summarycontents{% + \startcontents{\putwordShortTOC}% + % + \let\numchapentry = \shortchapentry + \let\appentry = \shortchapentry + \let\unnchapentry = \shortunnchapentry + % We want a true roman here for the page numbers. + \secfonts + \let\rm=\shortcontrm \let\bf=\shortcontbf + \let\sl=\shortcontsl \let\tt=\shortconttt + \rm + \hyphenpenalty = 10000 + \advance\baselineskip by 1pt % Open it up a little. + \def\numsecentry##1##2##3##4{} + \let\appsecentry = \numsecentry + \let\unnsecentry = \numsecentry + \let\numsubsecentry = \numsecentry + \let\appsubsecentry = \numsecentry + \let\unnsubsecentry = \numsecentry + \let\numsubsubsecentry = \numsecentry + \let\appsubsubsecentry = \numsecentry + \let\unnsubsubsecentry = \numsecentry + \openin 1 \jobname.toc + \ifeof 1 \else + \input \jobname.toc + \fi + \closein 1 + \vfill \eject + \contentsalignmacro % in case @setchapternewpage odd is in effect + \endgroup + \lastnegativepageno = \pageno + \global\pageno = \savepageno +} +\let\shortcontents = \summarycontents + +% Typeset the label for a chapter or appendix for the short contents. +% The arg is, e.g., `A' for an appendix, or `3' for a chapter. +% +\def\shortchaplabel#1{% + % This space should be enough, since a single number is .5em, and the + % widest letter (M) is 1em, at least in the Computer Modern fonts. + % But use \hss just in case. + % (This space doesn't include the extra space that gets added after + % the label; that gets put in by \shortchapentry above.) + % + % We'd like to right-justify chapter numbers, but that looks strange + % with appendix letters. And right-justifying numbers and + % left-justifying letters looks strange when there is less than 10 + % chapters. Have to read the whole toc once to know how many chapters + % there are before deciding ... + \hbox to 1em{#1\hss}% +} + +% These macros generate individual entries in the table of contents. +% The first argument is the chapter or section name. +% The last argument is the page number. +% The arguments in between are the chapter number, section number, ... + +% Chapters, in the main contents. +\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} +% +% Chapters, in the short toc. +% See comments in \dochapentry re vbox and related settings. +\def\shortchapentry#1#2#3#4{% + \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% +} + +% Appendices, in the main contents. +% Need the word Appendix, and a fixed-size box. +% +\def\appendixbox#1{% + % We use M since it's probably the widest letter. + \setbox0 = \hbox{\putwordAppendix{} M}% + \hbox to \wd0{\putwordAppendix{} #1\hss}} +% +\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}} + +% Unnumbered chapters. +\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} +\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} + +% Sections. +\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} +\let\appsecentry=\numsecentry +\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} + +% Subsections. +\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} +\let\appsubsecentry=\numsubsecentry +\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} + +% And subsubsections. +\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} +\let\appsubsubsecentry=\numsubsubsecentry +\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} + +% This parameter controls the indentation of the various levels. +% Same as \defaultparindent. +\newdimen\tocindent \tocindent = 15pt + +% Now for the actual typesetting. In all these, #1 is the text and #2 is the +% page number. +% +% If the toc has to be broken over pages, we want it to be at chapters +% if at all possible; hence the \penalty. +\def\dochapentry#1#2{% + \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip + \begingroup + \chapentryfonts + \tocentry{#1}{\dopageno\bgroup#2\egroup}% + \endgroup + \nobreak\vskip .25\baselineskip plus.1\baselineskip +} + +\def\dosecentry#1#2{\begingroup + \secentryfonts \leftskip=\tocindent + \tocentry{#1}{\dopageno\bgroup#2\egroup}% +\endgroup} + +\def\dosubsecentry#1#2{\begingroup + \subsecentryfonts \leftskip=2\tocindent + \tocentry{#1}{\dopageno\bgroup#2\egroup}% +\endgroup} + +\def\dosubsubsecentry#1#2{\begingroup + \subsubsecentryfonts \leftskip=3\tocindent + \tocentry{#1}{\dopageno\bgroup#2\egroup}% +\endgroup} + +% We use the same \entry macro as for the index entries. +\let\tocentry = \entry + +% Space between chapter (or whatever) number and the title. +\def\labelspace{\hskip1em \relax} + +\def\dopageno#1{{\rm #1}} +\def\doshortpageno#1{{\rm #1}} + +\def\chapentryfonts{\secfonts \rm} +\def\secentryfonts{\textfonts} +\def\subsecentryfonts{\textfonts} +\def\subsubsecentryfonts{\textfonts} + + +\message{environments,} +% @foo ... @end foo. + +% @point{}, @result{}, @expansion{}, @print{}, @equiv{}. +% +% Since these characters are used in examples, it should be an even number of +% \tt widths. Each \tt character is 1en, so two makes it 1em. +% +\def\point{$\star$} +\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} +\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}} +\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} +\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}} + +% The @error{} command. +% Adapted from the TeXbook's \boxit. +% +\newbox\errorbox +% +{\tentt \global\dimen0 = 3em}% Width of the box. +\dimen2 = .55pt % Thickness of rules +% The text. (`r' is open on the right, `e' somewhat less so on the left.) +\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt} +% +\setbox\errorbox=\hbox to \dimen0{\hfil + \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. + \advance\hsize by -2\dimen2 % Rules. + \vbox{% + \hrule height\dimen2 + \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. + \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. + \kern3pt\vrule width\dimen2}% Space to right. + \hrule height\dimen2} + \hfil} +% +\def\error{\leavevmode\lower.7ex\copy\errorbox} + +% @tex ... @end tex escapes into raw Tex temporarily. +% One exception: @ is still an escape character, so that @end tex works. +% But \@ or @@ will get a plain tex @ character. + +\envdef\tex{% + \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 + \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 + \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie + \catcode `\%=14 + \catcode `\+=\other + \catcode `\"=\other + \catcode `\|=\other + \catcode `\<=\other + \catcode `\>=\other + \escapechar=`\\ + % + \let\b=\ptexb + \let\bullet=\ptexbullet + \let\c=\ptexc + \let\,=\ptexcomma + \let\.=\ptexdot + \let\dots=\ptexdots + \let\equiv=\ptexequiv + \let\!=\ptexexclam + \let\i=\ptexi + \let\indent=\ptexindent + \let\noindent=\ptexnoindent + \let\{=\ptexlbrace + \let\+=\tabalign + \let\}=\ptexrbrace + \let\/=\ptexslash + \let\*=\ptexstar + \let\t=\ptext + % + \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% + \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% + \def\@{@}% +} +% There is no need to define \Etex. + +% Define @lisp ... @end lisp. +% @lisp environment forms a group so it can rebind things, +% including the definition of @end lisp (which normally is erroneous). + +% Amount to narrow the margins by for @lisp. +\newskip\lispnarrowing \lispnarrowing=0.4in + +% This is the definition that ^^M gets inside @lisp, @example, and other +% such environments. \null is better than a space, since it doesn't +% have any width. +\def\lisppar{\null\endgraf} + +% This space is always present above and below environments. +\newskip\envskipamount \envskipamount = 0pt + +% Make spacing and below environment symmetrical. We use \parskip here +% to help in doing that, since in @example-like environments \parskip +% is reset to zero; thus the \afterenvbreak inserts no space -- but the +% start of the next paragraph will insert \parskip. +% +\def\aboveenvbreak{{% + % =10000 instead of <10000 because of a special case in \itemzzz, q.v. + \ifnum \lastpenalty=10000 \else + \advance\envskipamount by \parskip + \endgraf + \ifdim\lastskip<\envskipamount + \removelastskip + % it's not a good place to break if the last penalty was \nobreak + % or better ... + \ifnum\lastpenalty<10000 \penalty-50 \fi + \vskip\envskipamount + \fi + \fi +}} + +\let\afterenvbreak = \aboveenvbreak + +% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins. +\let\nonarrowing=\relax + +% @cartouche ... @end cartouche: draw rectangle w/rounded corners around +% environment contents. +\font\circle=lcircle10 +\newdimen\circthick +\newdimen\cartouter\newdimen\cartinner +\newskip\normbskip\newskip\normpskip\newskip\normlskip +\circthick=\fontdimen8\circle +% +\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth +\def\ctr{{\hskip 6pt\circle\char'010}} +\def\cbl{{\circle\char'012\hskip -6pt}} +\def\cbr{{\hskip 6pt\circle\char'011}} +\def\carttop{\hbox to \cartouter{\hskip\lskip + \ctl\leaders\hrule height\circthick\hfil\ctr + \hskip\rskip}} +\def\cartbot{\hbox to \cartouter{\hskip\lskip + \cbl\leaders\hrule height\circthick\hfil\cbr + \hskip\rskip}} +% +\newskip\lskip\newskip\rskip + +\envdef\cartouche{% + \ifhmode\par\fi % can't be in the midst of a paragraph. + \startsavinginserts + \lskip=\leftskip \rskip=\rightskip + \leftskip=0pt\rightskip=0pt % we want these *outside*. + \cartinner=\hsize \advance\cartinner by-\lskip + \advance\cartinner by-\rskip + \cartouter=\hsize + \advance\cartouter by 18.4pt % allow for 3pt kerns on either + % side, and for 6pt waste from + % each corner char, and rule thickness + \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip + % Flag to tell @lisp, etc., not to narrow margin. + \let\nonarrowing=\comment + \vbox\bgroup + \baselineskip=0pt\parskip=0pt\lineskip=0pt + \carttop + \hbox\bgroup + \hskip\lskip + \vrule\kern3pt + \vbox\bgroup + \kern3pt + \hsize=\cartinner + \baselineskip=\normbskip + \lineskip=\normlskip + \parskip=\normpskip + \vskip -\parskip + \comment % For explanation, see the end of \def\group. +} +\def\Ecartouche{% + \ifhmode\par\fi + \kern3pt + \egroup + \kern3pt\vrule + \hskip\rskip + \egroup + \cartbot + \egroup + \checkinserts +} + + +% This macro is called at the beginning of all the @example variants, +% inside a group. +\def\nonfillstart{% + \aboveenvbreak + \hfuzz = 12pt % Don't be fussy + \sepspaces % Make spaces be word-separators rather than space tokens. + \let\par = \lisppar % don't ignore blank lines + \obeylines % each line of input is a line of output + \parskip = 0pt + \parindent = 0pt + \emergencystretch = 0pt % don't try to avoid overfull boxes + % @cartouche defines \nonarrowing to inhibit narrowing + % at next level down. + \ifx\nonarrowing\relax + \advance \leftskip by \lispnarrowing + \exdentamount=\lispnarrowing + \fi + \let\exdent=\nofillexdent +} + +% If you want all examples etc. small: @set dispenvsize small. +% If you want even small examples the full size: @set dispenvsize nosmall. +% This affects the following displayed environments: +% @example, @display, @format, @lisp +% +\def\smallword{small} +\def\nosmallword{nosmall} +\let\SETdispenvsize\relax +\def\setnormaldispenv{% + \ifx\SETdispenvsize\smallword + \smallexamplefonts \rm + \fi +} +\def\setsmalldispenv{% + \ifx\SETdispenvsize\nosmallword + \else + \smallexamplefonts \rm + \fi +} + +% We often define two environments, @foo and @smallfoo. +% Let's do it by one command: +\def\makedispenv #1#2{ + \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2} + \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2} + \expandafter\let\csname E#1\endcsname \afterenvbreak + \expandafter\let\csname Esmall#1\endcsname \afterenvbreak +} + +% Define two synonyms: +\def\maketwodispenvs #1#2#3{ + \makedispenv{#1}{#3} + \makedispenv{#2}{#3} +} + +% @lisp: indented, narrowed, typewriter font; @example: same as @lisp. +% +% @smallexample and @smalllisp: use smaller fonts. +% Originally contributed by Pavel@xerox. +% +\maketwodispenvs {lisp}{example}{% + \nonfillstart + \tt + \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. + \gobble % eat return +} + +% @display/@smalldisplay: same as @lisp except keep current font. +% +\makedispenv {display}{% + \nonfillstart + \gobble +} + +% @format/@smallformat: same as @display except don't narrow margins. +% +\makedispenv{format}{% + \let\nonarrowing = t% + \nonfillstart + \gobble +} + +% @flushleft: same as @format, but doesn't obey \SETdispenvsize. +\envdef\flushleft{% + \let\nonarrowing = t% + \nonfillstart + \gobble +} +\let\Eflushleft = \afterenvbreak + +% @flushright. +% +\envdef\flushright{% + \let\nonarrowing = t% + \nonfillstart + \advance\leftskip by 0pt plus 1fill + \gobble +} +\let\Eflushright = \afterenvbreak + + +% @quotation does normal linebreaking (hence we can't use \nonfillstart) +% and narrows the margins. We keep \parskip nonzero in general, since +% we're doing normal filling. So, when using \aboveenvbreak and +% \afterenvbreak, temporarily make \parskip 0. +% +\envdef\quotation{% + {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip + \parindent=0pt + % + % @cartouche defines \nonarrowing to inhibit narrowing at next level down. + \ifx\nonarrowing\relax + \advance\leftskip by \lispnarrowing + \advance\rightskip by \lispnarrowing + \exdentamount = \lispnarrowing + \let\nonarrowing = \relax + \fi + \parsearg\quotationlabel +} + +% We have retained a nonzero parskip for the environment, since we're +% doing normal filling. +% +\def\Equotation{% + \par + \ifx\quotationauthor\undefined\else + % indent a bit. + \leftline{\kern 2\leftskip \sl ---\quotationauthor}% + \fi + {\parskip=0pt \afterenvbreak}% +} + +% If we're given an argument, typeset it in bold with a colon after. +\def\quotationlabel#1{% + \def\temp{#1}% + \ifx\temp\empty \else + {\bf #1: }% + \fi +} + + +% LaTeX-like @verbatim...@end verbatim and @verb{...} +% If we want to allow any as delimiter, +% we need the curly braces so that makeinfo sees the @verb command, eg: +% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org +% +% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. +% +% [Knuth] p.344; only we need to do the other characters Texinfo sets +% active too. Otherwise, they get lost as the first character on a +% verbatim line. +\def\dospecials{% + \do\ \do\\\do\{\do\}\do\$\do\&% + \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% + \do\<\do\>\do\|\do\@\do+\do\"% +} +% +% [Knuth] p. 380 +\def\uncatcodespecials{% + \def\do##1{\catcode`##1=\other}\dospecials} +% +% [Knuth] pp. 380,381,391 +% Disable Spanish ligatures ?` and !` of \tt font +\begingroup + \catcode`\`=\active\gdef`{\relax\lq} +\endgroup +% +% Setup for the @verb command. +% +% Eight spaces for a tab +\begingroup + \catcode`\^^I=\active + \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} +\endgroup +% +\def\setupverb{% + \tt % easiest (and conventionally used) font for verbatim + \def\par{\leavevmode\endgraf}% + \catcode`\`=\active + \tabeightspaces + % Respect line breaks, + % print special symbols as themselves, and + % make each space count + % must do in this order: + \obeylines \uncatcodespecials \sepspaces +} + +% Setup for the @verbatim environment +% +% Real tab expansion +\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount +% +\def\starttabbox{\setbox0=\hbox\bgroup} +\begingroup + \catcode`\^^I=\active + \gdef\tabexpand{% + \catcode`\^^I=\active + \def^^I{\leavevmode\egroup + \dimen0=\wd0 % the width so far, or since the previous tab + \divide\dimen0 by\tabw + \multiply\dimen0 by\tabw % compute previous multiple of \tabw + \advance\dimen0 by\tabw % advance to next multiple of \tabw + \wd0=\dimen0 \box0 \starttabbox + }% + } +\endgroup +\def\setupverbatim{% + \nonfillstart + \advance\leftskip by -\defbodyindent + % Easiest (and conventionally used) font for verbatim + \tt + \def\par{\leavevmode\egroup\box0\endgraf}% + \catcode`\`=\active + \tabexpand + % Respect line breaks, + % print special symbols as themselves, and + % make each space count + % must do in this order: + \obeylines \uncatcodespecials \sepspaces + \everypar{\starttabbox}% +} + +% Do the @verb magic: verbatim text is quoted by unique +% delimiter characters. Before first delimiter expect a +% right brace, after last delimiter expect closing brace: +% +% \def\doverb'{'#1'}'{#1} +% +% [Knuth] p. 382; only eat outer {} +\begingroup + \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other + \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] +\endgroup +% +\def\verb{\begingroup\setupverb\doverb} +% +% +% Do the @verbatim magic: define the macro \doverbatim so that +% the (first) argument ends when '@end verbatim' is reached, ie: +% +% \def\doverbatim#1@end verbatim{#1} +% +% For Texinfo it's a lot easier than for LaTeX, +% because texinfo's \verbatim doesn't stop at '\end{verbatim}': +% we need not redefine '\', '{' and '}'. +% +% Inspired by LaTeX's verbatim command set [latex.ltx] +% +\begingroup + \catcode`\ =\active + \obeylines % + % ignore everything up to the first ^^M, that's the newline at the end + % of the @verbatim input line itself. Otherwise we get an extra blank + % line in the output. + \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}% + % We really want {...\end verbatim} in the body of the macro, but + % without the active space; thus we have to use \xdef and \gobble. +\endgroup +% +\envdef\verbatim{% + \setupverbatim\doverbatim +} +\let\Everbatim = \afterenvbreak + + +% @verbatiminclude FILE - insert text of file in verbatim environment. +% +\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} +% +\def\doverbatiminclude#1{% + {% + \makevalueexpandable + \setupverbatim + \input #1 + \afterenvbreak + }% +} + +% @copying ... @end copying. +% Save the text away for @insertcopying later. Many commands won't be +% allowed in this context, but that's ok. +% +% We save the uninterpreted tokens, rather than creating a box. +% Saving the text in a box would be much easier, but then all the +% typesetting commands (@smallbook, font changes, etc.) have to be done +% beforehand -- and a) we want @copying to be done first in the source +% file; b) letting users define the frontmatter in as flexible order as +% possible is very desirable. +% +\def\copying{\begingroup + % Define a command to swallow text until we reach `@end copying'. + % \ is the escape char in this texinfo.tex file, so it is the + % delimiter for the command; @ will be the escape char when we read + % it, but that doesn't matter. + \long\def\docopying##1\end copying{\gdef\copyingtext{##1}\enddocopying}% + % + % We must preserve ^^M's in the input file; see \insertcopying below. + \catcode`\^^M = \active + \docopying +} + +% What we do to finish off the copying text. +% +\def\enddocopying{\endgroup\ignorespaces} + +% @insertcopying. Here we must play games with ^^M's. On the one hand, +% we need them to delimit commands such as `@end quotation', so they +% must be active. On the other hand, we certainly don't want every +% end-of-line to be a \par, as would happen with the normal active +% definition of ^^M. On the third hand, two ^^M's in a row should still +% generate a \par. +% +% Our approach is to make ^^M insert a space and a penalty1 normally; +% then it can also check if \lastpenalty=1. If it does, then manually +% do \par. +% +% This messes up the normal definitions of @c[omment], so we redefine +% it. Similarly for @ignore. (These commands are used in the gcc +% manual for man page generation.) +% +% Seems pretty fragile, most line-oriented commands will presumably +% fail, but for the limited use of getting the copying text (which +% should be quite simple) inserted, we can hope it's ok. +% +{\catcode`\^^M=\active % +\gdef\insertcopying{\begingroup % + \parindent = 0pt % looks wrong on title page + \def^^M{% + \ifnum \lastpenalty=1 % + \par % + \else % + \space \penalty 1 % + \fi % + }% + % + % Fix @c[omment] for catcode 13 ^^M's. + \def\c##1^^M{\ignorespaces}% + \let\comment = \c % + % + % Don't bother jumping through all the hoops that \doignore does, it + % would be very hard since the catcodes are already set. + \long\def\ignore##1\end ignore{\ignorespaces}% + % + \copyingtext % +\endgroup}% +} + +\message{defuns,} +% @defun etc. + +\newskip\defbodyindent \defbodyindent=.4in +\newskip\defargsindent \defargsindent=50pt +\newskip\deflastargmargin \deflastargmargin=18pt + +% Start the processing of @deffn: +\def\startdefun{% + \ifnum\lastpenalty<10000 + \medbreak + \else + % If there are two @def commands in a row, we'll have a \nobreak, + % which is there to keep the function description together with its + % header. But if there's nothing but headers, we need to allow a + % break somewhere. Check for penalty 10002 (inserted by + % \defargscommonending) instead of 10000, since the sectioning + % commands insert a \penalty10000, and we don't want to allow a break + % between a section heading and a defun. + \ifnum\lastpenalty=10002 \penalty2000 \fi + % + % Similarly, after a section heading, do not allow a break. + % But do insert the glue. + \medskip % preceded by discardable penalty, so not a breakpoint + \fi + % + \parindent=0in + \advance\leftskip by \defbodyindent + \exdentamount=\defbodyindent +} + +\def\dodefunx#1{% + % First, check whether we are in the right environment: + \checkenv#1% + % + % As above, allow line break if we have multiple x headers in a row. + % It's not a great place, though. + \ifnum\lastpenalty=10002 \penalty3000 \fi + % + % And now, it's time to reuse the body of the original defun: + \expandafter\gobbledefun#1% +} +\def\gobbledefun#1\startdefun{} + +% \printdefunline \deffnheader{text} +% +\def\printdefunline#1#2{% + \begingroup + % call \deffnheader: + #1#2 \endheader + % common ending: + \interlinepenalty = 10000 + \advance\rightskip by 0pt plus 1fil + \endgraf + \nobreak\vskip -\parskip + \penalty 10002 % signal to \startdefun and \dodefunx + % Some of the @defun-type tags do not enable magic parentheses, + % rendering the following check redundant. But we don't optimize. + \checkparencounts + \endgroup +} + +\def\Edefun{\endgraf\medbreak} + +% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; +% the only thing remainnig is to define \deffnheader. +% +\def\makedefun#1{% + \expandafter\let\csname E#1\endcsname = \Edefun + \edef\temp{\noexpand\domakedefun + \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% + \temp +} + +% \domakedefun \deffn \deffnx \deffnheader +% +% Define \deffn and \deffnx, without parameters. +% \deffnheader has to be defined explicitly. +% +\def\domakedefun#1#2#3{% + \envdef#1{% + \startdefun + \parseargusing\activeparens{\printdefunline#3}% + }% + \def#2{\dodefunx#1}% + \def#3% +} + +%%% Untyped functions: + +% @deffn category name args +\makedefun{deffn}{\deffngeneral{}} + +% @deffn category class name args +\makedefun{defop}#1 {\defopon{#1\ \putwordon}} + +% \defopon {category on}class name args +\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } + +% \deffngeneral {subind}category name args +% +\def\deffngeneral#1#2 #3 #4\endheader{% + % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. + \dosubind{fn}{\code{#3}}{#1}% + \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% +} + +%%% Typed functions: + +% @deftypefn category type name args +\makedefun{deftypefn}{\deftypefngeneral{}} + +% @deftypeop category class type name args +\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} + +% \deftypeopon {category on}class type name args +\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } + +% \deftypefngeneral {subind}category type name args +% +\def\deftypefngeneral#1#2 #3 #4 #5\endheader{% + \dosubind{fn}{\code{#4}}{#1}% + \defname{#2}{#3}{#4}\defunargs{#5\unskip}% +} + +%%% Typed variables: + +% @deftypevr category type var args +\makedefun{deftypevr}{\deftypecvgeneral{}} + +% @deftypecv category class type var args +\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} + +% \deftypecvof {category of}class type var args +\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } + +% \deftypecvgeneral {subind}category type var args +% +\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% + \dosubind{vr}{\code{#4}}{#1}% + \defname{#2}{#3}{#4}\defunargs{#5\unskip}% +} + +%%% Untyped variables: + +% @defvr category var args +\makedefun{defvr}#1 {\deftypevrheader{#1} {} } + +% @defcv category class var args +\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} + +% \defcvof {category of}class var args +\def\defcvof#1#2 {\deftypecvof{#1}#2 {} } + +%%% Type: +% @deftp category name args +\makedefun{deftp}#1 #2 #3\endheader{% + \doind{tp}{\code{#2}}% + \defname{#1}{}{#2}\defunargs{#3\unskip}% +} + +% Remaining @defun-like shortcuts: +\makedefun{defun}{\deffnheader{\putwordDeffunc} } +\makedefun{defmac}{\deffnheader{\putwordDefmac} } +\makedefun{defspec}{\deffnheader{\putwordDefspec} } +\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } +\makedefun{defvar}{\defvrheader{\putwordDefvar} } +\makedefun{defopt}{\defvrheader{\putwordDefopt} } +\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } +\makedefun{defmethod}{\defopon\putwordMethodon} +\makedefun{deftypemethod}{\deftypeopon\putwordMethodon} +\makedefun{defivar}{\defcvof\putwordInstanceVariableof} +\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} + +% \defname, which formats the name of the @def (not the args). +% #1 is the category, such as "Function". +% #2 is the return type, if any. +% #3 is the function name. +% +% We are followed by (but not passed) the arguments, if any. +% +\def\defname#1#2#3{% + % Get the values of \leftskip and \rightskip as they were outside the @def... + \advance\leftskip by -\defbodyindent + % + % How we'll format the type name. Putting it in brackets helps + % distinguish it from the body text that may end up on the next line + % just below it. + \def\temp{#1}% + \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} + % + % Figure out line sizes for the paragraph shape. + % The first line needs space for \box0; but if \rightskip is nonzero, + % we need only space for the part of \box0 which exceeds it: + \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip + % The continuations: + \dimen2=\hsize \advance\dimen2 by -\defargsindent + % (plain.tex says that \dimen1 should be used only as global.) + \parshape 2 0in \dimen0 \defargsindent \dimen2 + % + % Put the type name to the right margin. + \noindent + \hbox to 0pt{% + \hfil\box0 \kern-\hsize + % \hsize has to be shortened this way: + \kern\leftskip + % Intentionally do not respect \rightskip, since we need the space. + }% + % + % Allow all lines to be underfull without complaint: + \tolerance=10000 \hbadness=10000 + \exdentamount=\defbodyindent + {% + % defun fonts. We use typewriter by default (used to be bold) because: + % . we're printing identifiers, they should be in tt in principle. + % . in languages with many accents, such as Czech or French, it's + % common to leave accents off identifiers. The result looks ok in + % tt, but exceedingly strange in rm. + % . we don't want -- and --- to be treated as ligatures. + % . this still does not fix the ?` and !` ligatures, but so far no + % one has made identifiers using them :). + \df \tt + \def\temp{#2}% return value type + \ifx\temp\empty\else \tclose{\temp} \fi + #3% output function name + }% + {\rm\enskip}% hskip 0.5 em of \tenrm + % + \boldbrax + % arguments will be output next, if any. +} + +% Print arguments in slanted roman (not ttsl), inconsistently with using +% tt for the name. This is because literal text is sometimes needed in +% the argument list (groff manual), and ttsl and tt are not very +% distinguishable. Prevent hyphenation at `-' chars. +% +\def\defunargs#1{% + % use sl by default (not ttsl), + % tt for the names. + \df \sl \hyphenchar\font=0 + % + % On the other hand, if an argument has two dashes (for instance), we + % want a way to get ttsl. Let's try @var for that. + \let\var=\ttslanted + #1% + \sl\hyphenchar\font=45 +} + +% We want ()&[] to print specially on the defun line. +% +\def\activeparens{% + \catcode`\(=\active \catcode`\)=\active + \catcode`\[=\active \catcode`\]=\active + \catcode`\&=\active +} + +% Make control sequences which act like normal parenthesis chars. +\let\lparen = ( \let\rparen = ) + +% Be sure that we always have a definition for `(', etc. For example, +% if the fn name has parens in it, \boldbrax will not be in effect yet, +% so TeX would otherwise complain about undefined control sequence. +{ + \activeparens + \global\let(=\lparen \global\let)=\rparen + \global\let[=\lbrack \global\let]=\rbrack + \global\let& = \& + + \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} + \gdef\magicamp{\let&=\amprm} +} + +\newcount\parencount + +% If we encounter &foo, then turn on ()-hacking afterwards +\newif\ifampseen +\def\amprm#1 {\ampseentrue{\bf\ }} + +\def\parenfont{% + \ifampseen + % At the first level, print parens in roman, + % otherwise use the default font. + \ifnum \parencount=1 \rm \fi + \else + % The \sf parens (in \boldbrax) actually are a little bolder than + % the contained text. This is especially needed for [ and ] . + \sf + \fi +} +\def\infirstlevel#1{% + \ifampseen + \ifnum\parencount=1 + #1% + \fi + \fi +} +\def\bfafterword#1 {#1 \bf} + +\def\opnr{% + \global\advance\parencount by 1 + {\parenfont(}% + \infirstlevel \bfafterword +} +\def\clnr{% + {\parenfont)}% + \infirstlevel \sl + \global\advance\parencount by -1 +} + +\newcount\brackcount +\def\lbrb{% + \global\advance\brackcount by 1 + {\bf[}% +} +\def\rbrb{% + {\bf]}% + \global\advance\brackcount by -1 +} + +\def\checkparencounts{% + \ifnum\parencount=0 \else \badparencount \fi + \ifnum\brackcount=0 \else \badbrackcount \fi +} +\def\badparencount{% + \errmessage{Unbalanced parentheses in @def}% + \global\parencount=0 +} +\def\badbrackcount{% + \errmessage{Unbalanced square braces in @def}% + \global\brackcount=0 +} + + +\message{macros,} +% @macro. + +% To do this right we need a feature of e-TeX, \scantokens, +% which we arrange to emulate with a temporary file in ordinary TeX. +\ifx\eTeXversion\undefined + \newwrite\macscribble + \def\scantokens#1{% + \toks0={#1\endinput}% + \immediate\openout\macscribble=\jobname.tmp + \immediate\write\macscribble{\the\toks0}% + \immediate\closeout\macscribble + \input \jobname.tmp + } +\fi + +\def\scanmacro#1{% + \begingroup + \newlinechar`\^^M + \let\xeatspaces\eatspaces + % Undo catcode changes of \startcontents and \doprintindex + \catcode`\@=0 \catcode`\\=\other \escapechar=`\@ + % ... and \example + \spaceisspace + % + % Append \endinput to make sure that TeX does not see the ending newline. + % + % I've verified that it is necessary both for e-TeX and for ordinary TeX + % --kasal, 29nov03 + \scantokens{#1\endinput}% + \endgroup +} + +\newcount\paramno % Count of parameters +\newtoks\macname % Macro name +\newif\ifrecursive % Is it recursive? +\def\macrolist{} % List of all defined macros in the form + % \do\macro1\do\macro2... + +% Utility routines. +% This does \let #1 = #2, except with \csnames. +\def\cslet#1#2{% +\expandafter\expandafter +\expandafter\let +\expandafter\expandafter +\csname#1\endcsname +\csname#2\endcsname} + +% Trim leading and trailing spaces off a string. +% Concepts from aro-bend problem 15 (see CTAN). +{\catcode`\@=11 +\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} +\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} +\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} +\def\unbrace#1{#1} +\unbrace{\gdef\trim@@@ #1 } #2@{#1} +} + +% Trim a single trailing ^^M off a string. +{\catcode`\^^M=\other \catcode`\Q=3% +\gdef\eatcr #1{\eatcra #1Q^^MQ}% +\gdef\eatcra#1^^MQ{\eatcrb#1Q}% +\gdef\eatcrb#1Q#2Q{#1}% +} + +% Macro bodies are absorbed as an argument in a context where +% all characters are catcode 10, 11 or 12, except \ which is active +% (as in normal texinfo). It is necessary to change the definition of \. + +% It's necessary to have hard CRs when the macro is executed. This is +% done by making ^^M (\endlinechar) catcode 12 when reading the macro +% body, and then making it the \newlinechar in \scanmacro. + +\def\macrobodyctxt{% + \catcode`\~=\other + \catcode`\^=\other + \catcode`\_=\other + \catcode`\|=\other + \catcode`\<=\other + \catcode`\>=\other + \catcode`\+=\other + \catcode`\{=\other + \catcode`\}=\other + \catcode`\@=\other + \catcode`\^^M=\other + \usembodybackslash} + +\def\macroargctxt{% + \catcode`\~=\other + \catcode`\^=\other + \catcode`\_=\other + \catcode`\|=\other + \catcode`\<=\other + \catcode`\>=\other + \catcode`\+=\other + \catcode`\@=\other + \catcode`\\=\other} + +% \mbodybackslash is the definition of \ in @macro bodies. +% It maps \foo\ => \csname macarg.foo\endcsname => #N +% where N is the macro parameter number. +% We define \csname macarg.\endcsname to be \realbackslash, so +% \\ in macro replacement text gets you a backslash. + +{\catcode`@=0 @catcode`@\=@active + @gdef@usembodybackslash{@let\=@mbodybackslash} + @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} +} +\expandafter\def\csname macarg.\endcsname{\realbackslash} + +\def\macro{\recursivefalse\parsearg\macroxxx} +\def\rmacro{\recursivetrue\parsearg\macroxxx} + +\def\macroxxx#1{% + \getargs{#1}% now \macname is the macname and \argl the arglist + \ifx\argl\empty % no arguments + \paramno=0% + \else + \expandafter\parsemargdef \argl;% + \fi + \if1\csname ismacro.\the\macname\endcsname + \message{Warning: redefining \the\macname}% + \else + \expandafter\ifx\csname \the\macname\endcsname \relax + \else \errmessage{Macro name \the\macname\space already defined}\fi + \global\cslet{macsave.\the\macname}{\the\macname}% + \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% + % Add the macroname to \macrolist + \toks0 = \expandafter{\macrolist\do}% + \xdef\macrolist{\the\toks0 + \expandafter\noexpand\csname\the\macname\endcsname}% + \fi + \begingroup \macrobodyctxt + \ifrecursive \expandafter\parsermacbody + \else \expandafter\parsemacbody + \fi} + +\parseargdef\unmacro{% + \if1\csname ismacro.#1\endcsname + \global\cslet{#1}{macsave.#1}% + \global\expandafter\let \csname ismacro.#1\endcsname=0% + % Remove the macro name from \macrolist: + \begingroup + \expandafter\let\csname#1\endcsname \relax + \let\do\unmacrodo + \xdef\macrolist{\macrolist}% + \endgroup + \else + \errmessage{Macro #1 not defined}% + \fi +} + +% Called by \do from \dounmacro on each macro. The idea is to omit any +% macro definitions that have been changed to \relax. +% +\def\unmacrodo#1{% + \ifx#1\relax + % remove this + \else + \noexpand\do \noexpand #1% + \fi +} + +% This makes use of the obscure feature that if the last token of a +% is #, then the preceding argument is delimited by +% an opening brace, and that opening brace is not consumed. +\def\getargs#1{\getargsxxx#1{}} +\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} +\def\getmacname #1 #2\relax{\macname={#1}} +\def\getmacargs#1{\def\argl{#1}} + +% Parse the optional {params} list. Set up \paramno and \paramlist +% so \defmacro knows what to do. Define \macarg.blah for each blah +% in the params list, to be ##N where N is the position in that list. +% That gets used by \mbodybackslash (above). + +% We need to get `macro parameter char #' into several definitions. +% The technique used is stolen from LaTeX: let \hash be something +% unexpandable, insert that wherever you need a #, and then redefine +% it to # just before using the token list produced. +% +% The same technique is used to protect \eatspaces till just before +% the macro is used. + +\def\parsemargdef#1;{\paramno=0\def\paramlist{}% + \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,} +\def\parsemargdefxxx#1,{% + \if#1;\let\next=\relax + \else \let\next=\parsemargdefxxx + \advance\paramno by 1% + \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname + {\xeatspaces{\hash\the\paramno}}% + \edef\paramlist{\paramlist\hash\the\paramno,}% + \fi\next} + +% These two commands read recursive and nonrecursive macro bodies. +% (They're different since rec and nonrec macros end differently.) + +\long\def\parsemacbody#1@end macro% +{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% +\long\def\parsermacbody#1@end rmacro% +{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% + +% This defines the macro itself. There are six cases: recursive and +% nonrecursive macros of zero, one, and many arguments. +% Much magic with \expandafter here. +% \xdef is used so that macro definitions will survive the file +% they're defined in; @include reads the file inside a group. +\def\defmacro{% + \let\hash=##% convert placeholders to macro parameter chars + \ifrecursive + \ifcase\paramno + % 0 + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\scanmacro{\temp}}% + \or % 1 + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\braceorline + \expandafter\noexpand\csname\the\macname xxx\endcsname}% + \expandafter\xdef\csname\the\macname xxx\endcsname##1{% + \egroup\noexpand\scanmacro{\temp}}% + \else % many + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\csname\the\macname xx\endcsname}% + \expandafter\xdef\csname\the\macname xx\endcsname##1{% + \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% + \expandafter\expandafter + \expandafter\xdef + \expandafter\expandafter + \csname\the\macname xxx\endcsname + \paramlist{\egroup\noexpand\scanmacro{\temp}}% + \fi + \else + \ifcase\paramno + % 0 + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \or % 1 + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\braceorline + \expandafter\noexpand\csname\the\macname xxx\endcsname}% + \expandafter\xdef\csname\the\macname xxx\endcsname##1{% + \egroup + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \else % many + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \expandafter\noexpand\csname\the\macname xx\endcsname}% + \expandafter\xdef\csname\the\macname xx\endcsname##1{% + \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% + \expandafter\expandafter + \expandafter\xdef + \expandafter\expandafter + \csname\the\macname xxx\endcsname + \paramlist{% + \egroup + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \fi + \fi} + +\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} + +% \braceorline decides whether the next nonwhitespace character is a +% {. If so it reads up to the closing }, if not, it reads the whole +% line. Whatever was read is then fed to the next control sequence +% as an argument (by \parsebrace or \parsearg) +\def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx} +\def\braceorlinexxx{% + \ifx\nchar\bgroup\else + \expandafter\parsearg + \fi \next} + +% We mant to disable all macros during \shipout so that they are not +% expanded by \write. +\def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=\relax}% + \edef\next{\macrolist}\expandafter\endgroup\next} + + +% @alias. +% We need some trickery to remove the optional spaces around the equal +% sign. Just make them active and then expand them all to nothing. +\def\alias{\parseargusing\obeyspaces\aliasxxx} +\def\aliasxxx #1{\aliasyyy#1\relax} +\def\aliasyyy #1=#2\relax{% + {% + \expandafter\let\obeyedspace=\empty + \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% + }% + \next +} + + +\message{cross references,} + +\newwrite\auxfile + +\newif\ifhavexrefs % True if xref values are known. +\newif\ifwarnedxrefs % True if we warned once that they aren't known. + +% @inforef is relatively simple. +\def\inforef #1{\inforefzzz #1,,,,**} +\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, + node \samp{\ignorespaces#1{}}} + +% @node's only job in TeX is to define \lastnode, which is used in +% cross-references. The @node line might or might not have commas, and +% might or might not have spaces before the first comma, like: +% @node foo , bar , ... +% We don't want such trailing spaces in the node name. +% +\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} +% +% also remove a trailing comma, in case of something like this: +% @node Help-Cross, , , Cross-refs +\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} +\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}} + +\let\nwnode=\node +\let\lastnode=\empty + +% Write a cross-reference definition for the current node. #1 is the +% type (Ynumbered, Yappendix, Ynothing). +% +\def\donoderef#1{% + \ifx\lastnode\empty\else + \setref{\lastnode}{#1}% + \global\let\lastnode=\empty + \fi +} + +% @anchor{NAME} -- define xref target at arbitrary point. +% +\newcount\savesfregister +% +\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} +\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} +\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} + +% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an +% anchor), which consists of three parts: +% 1) NAME-title - the current sectioning name taken from \thissection, +% or the anchor name. +% 2) NAME-snt - section number and type, passed as the SNT arg, or +% empty for anchors. +% 3) NAME-pg - the page number. +% +% This is called from \donoderef, \anchor, and \dofloat. In the case of +% floats, there is an additional part, which is not written here: +% 4) NAME-lof - the text as it should appear in a @listoffloats. +% +\def\setref#1#2{% + \pdfmkdest{#1}% + \iflinks + {% + \atdummies % preserve commands, but don't expand them + \turnoffactive + \otherbackslash + \edef\writexrdef##1##2{% + \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef + ##1}{##2}}% these are parameters of \writexrdef + }% + \toks0 = \expandafter{\thissection}% + \immediate \writexrdef{title}{\the\toks0 }% + \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. + \writexrdef{pg}{\folio}% will be written later, during \shipout + }% + \fi +} + +% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is +% the node name, #2 the name of the Info cross-reference, #3 the printed +% node name, #4 the name of the Info file, #5 the name of the printed +% manual. All but the node name can be omitted. +% +\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} +\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} +\def\ref#1{\xrefX[#1,,,,,,,]} +\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup + \unsepspaces + \def\printedmanual{\ignorespaces #5}% + \def\printedrefname{\ignorespaces #3}% + \setbox1=\hbox{\printedmanual\unskip}% + \setbox0=\hbox{\printedrefname\unskip}% + \ifdim \wd0 = 0pt + % No printed node name was explicitly given. + \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax + % Use the node name inside the square brackets. + \def\printedrefname{\ignorespaces #1}% + \else + % Use the actual chapter/section title appear inside + % the square brackets. Use the real section title if we have it. + \ifdim \wd1 > 0pt + % It is in another manual, so we don't have it. + \def\printedrefname{\ignorespaces #1}% + \else + \ifhavexrefs + % We know the real title if we have the xref values. + \def\printedrefname{\refx{#1-title}{}}% + \else + % Otherwise just copy the Info node name. + \def\printedrefname{\ignorespaces #1}% + \fi% + \fi + \fi + \fi + % + % Make link in pdf output. + \ifpdf + \leavevmode + \getfilename{#4}% + {\turnoffactive \otherbackslash + \ifnum\filenamelength>0 + \startlink attr{/Border [0 0 0]}% + goto file{\the\filename.pdf} name{#1}% + \else + \startlink attr{/Border [0 0 0]}% + goto name{\pdfmkpgn{#1}}% + \fi + }% + \linkcolor + \fi + % + % Float references are printed completely differently: "Figure 1.2" + % instead of "[somenode], p.3". We distinguish them by the + % LABEL-title being set to a magic string. + {% + % Have to otherify everything special to allow the \csname to + % include an _ in the xref name, etc. + \indexnofonts + \turnoffactive + \otherbackslash + \expandafter\global\expandafter\let\expandafter\Xthisreftitle + \csname XR#1-title\endcsname + }% + \iffloat\Xthisreftitle + % If the user specified the print name (third arg) to the ref, + % print it instead of our usual "Figure 1.2". + \ifdim\wd0 = 0pt + \refx{#1-snt}% + \else + \printedrefname + \fi + % + % if the user also gave the printed manual name (fifth arg), append + % "in MANUALNAME". + \ifdim \wd1 > 0pt + \space \putwordin{} \cite{\printedmanual}% + \fi + \else + % node/anchor (non-float) references. + % + % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not + % insert empty discretionaries after hyphens, which means that it will + % not find a line break at a hyphen in a node names. Since some manuals + % are best written with fairly long node names, containing hyphens, this + % is a loss. Therefore, we give the text of the node name again, so it + % is as if TeX is seeing it for the first time. + \ifdim \wd1 > 0pt + \putwordsection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}% + \else + % _ (for example) has to be the character _ for the purposes of the + % control sequence corresponding to the node, but it has to expand + % into the usual \leavevmode...\vrule stuff for purposes of + % printing. So we \turnoffactive for the \refx-snt, back on for the + % printing, back off for the \refx-pg. + {\turnoffactive \otherbackslash + % Only output a following space if the -snt ref is nonempty; for + % @unnumbered and @anchor, it won't be. + \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% + \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi + }% + % output the `[mynode]' via a macro so it can be overridden. + \xrefprintnodename\printedrefname + % + % But we always want a comma and a space: + ,\space + % + % output the `page 3'. + \turnoffactive \otherbackslash \putwordpage\tie\refx{#1-pg}{}% + \fi + \fi + \endlink +\endgroup} + +% This macro is called from \xrefX for the `[nodename]' part of xref +% output. It's a separate macro only so it can be changed more easily, +% since square brackets don't work well in some documents. Particularly +% one that Bob is working on :). +% +\def\xrefprintnodename#1{[#1]} + +% Things referred to by \setref. +% +\def\Ynothing{} +\def\Yomitfromtoc{} +\def\Ynumbered{% + \ifnum\secno=0 + \putwordChapter@tie \the\chapno + \else \ifnum\subsecno=0 + \putwordSection@tie \the\chapno.\the\secno + \else \ifnum\subsubsecno=0 + \putwordSection@tie \the\chapno.\the\secno.\the\subsecno + \else + \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno + \fi\fi\fi +} +\def\Yappendix{% + \ifnum\secno=0 + \putwordAppendix@tie @char\the\appendixno{}% + \else \ifnum\subsecno=0 + \putwordSection@tie @char\the\appendixno.\the\secno + \else \ifnum\subsubsecno=0 + \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno + \else + \putwordSection@tie + @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno + \fi\fi\fi +} + +% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. +% If its value is nonempty, SUFFIX is output afterward. +% +\def\refx#1#2{% + {% + \indexnofonts + \otherbackslash + \expandafter\global\expandafter\let\expandafter\thisrefX + \csname XR#1\endcsname + }% + \ifx\thisrefX\relax + % If not defined, say something at least. + \angleleft un\-de\-fined\angleright + \iflinks + \ifhavexrefs + \message{\linenumber Undefined cross reference `#1'.}% + \else + \ifwarnedxrefs\else + \global\warnedxrefstrue + \message{Cross reference values unknown; you must run TeX again.}% + \fi + \fi + \fi + \else + % It's defined, so just use it. + \thisrefX + \fi + #2% Output the suffix in any case. +} + +% This is the macro invoked by entries in the aux file. Usually it's +% just a \def (we prepend XR to the control sequence name to avoid +% collisions). But if this is a float type, we have more work to do. +% +\def\xrdef#1#2{% + \expandafter\gdef\csname XR#1\endcsname{#2}% remember this xref value. + % + % Was that xref control sequence that we just defined for a float? + \expandafter\iffloat\csname XR#1\endcsname + % it was a float, and we have the (safe) float type in \iffloattype. + \expandafter\let\expandafter\floatlist + \csname floatlist\iffloattype\endcsname + % + % Is this the first time we've seen this float type? + \expandafter\ifx\floatlist\relax + \toks0 = {\do}% yes, so just \do + \else + % had it before, so preserve previous elements in list. + \toks0 = \expandafter{\floatlist\do}% + \fi + % + % Remember this xref in the control sequence \floatlistFLOATTYPE, + % for later use in \listoffloats. + \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0{#1}}% + \fi +} + +% Read the last existing aux file, if any. No error if none exists. +% +\def\tryauxfile{% + \openin 1 \jobname.aux + \ifeof 1 \else + \readauxfile + \global\havexrefstrue + \fi + \closein 1 +} + +\def\readauxfile{\begingroup + \catcode`\^^@=\other + \catcode`\^^A=\other + \catcode`\^^B=\other + \catcode`\^^C=\other + \catcode`\^^D=\other + \catcode`\^^E=\other + \catcode`\^^F=\other + \catcode`\^^G=\other + \catcode`\^^H=\other + \catcode`\^^K=\other + \catcode`\^^L=\other + \catcode`\^^N=\other + \catcode`\^^P=\other + \catcode`\^^Q=\other + \catcode`\^^R=\other + \catcode`\^^S=\other + \catcode`\^^T=\other + \catcode`\^^U=\other + \catcode`\^^V=\other + \catcode`\^^W=\other + \catcode`\^^X=\other + \catcode`\^^Z=\other + \catcode`\^^[=\other + \catcode`\^^\=\other + \catcode`\^^]=\other + \catcode`\^^^=\other + \catcode`\^^_=\other + % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. + % in xref tags, i.e., node names. But since ^^e4 notation isn't + % supported in the main text, it doesn't seem desirable. Furthermore, + % that is not enough: for node names that actually contain a ^ + % character, we would end up writing a line like this: 'xrdef {'hat + % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first + % argument, and \hat is not an expandable control sequence. It could + % all be worked out, but why? Either we support ^^ or we don't. + % + % The other change necessary for this was to define \auxhat: + % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter + % and then to call \auxhat in \setq. + % + \catcode`\^=\other + % + % Special characters. Should be turned off anyway, but... + \catcode`\~=\other + \catcode`\[=\other + \catcode`\]=\other + \catcode`\"=\other + \catcode`\_=\other + \catcode`\|=\other + \catcode`\<=\other + \catcode`\>=\other + \catcode`\$=\other + \catcode`\#=\other + \catcode`\&=\other + \catcode`\%=\other + \catcode`+=\other % avoid \+ for paranoia even though we've turned it off + % + % This is to support \ in node names and titles, since the \ + % characters end up in a \csname. It's easier than + % leaving it active and making its active definition an actual \ + % character. What I don't understand is why it works in the *value* + % of the xrdef. Seems like it should be a catcode12 \, and that + % should not typeset properly. But it works, so I'm moving on for + % now. --karl, 15jan04. + \catcode`\\=\other + % + % Make the characters 128-255 be printing characters. + {% + \count 1=128 + \def\loop{% + \catcode\count 1=\other + \advance\count 1 by 1 + \ifnum \count 1<256 \loop \fi + }% + }% + % + % @ is our escape character in .aux files, and we need braces. + \catcode`\{=1 + \catcode`\}=2 + \catcode`\@=0 + % + \input \jobname.aux +\endgroup} + + +\message{insertions,} +% including footnotes. + +\newcount \footnoteno + +% The trailing space in the following definition for supereject is +% vital for proper filling; pages come out unaligned when you do a +% pagealignmacro call if that space before the closing brace is +% removed. (Generally, numeric constants should always be followed by a +% space to prevent strange expansion errors.) +\def\supereject{\par\penalty -20000\footnoteno =0 } + +% @footnotestyle is meaningful for info output only. +\let\footnotestyle=\comment + +{\catcode `\@=11 +% +% Auto-number footnotes. Otherwise like plain. +\gdef\footnote{% + \let\indent=\ptexindent + \let\noindent=\ptexnoindent + \global\advance\footnoteno by \@ne + \edef\thisfootno{$^{\the\footnoteno}$}% + % + % In case the footnote comes at the end of a sentence, preserve the + % extra spacing after we do the footnote number. + \let\@sf\empty + \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi + % + % Remove inadvertent blank space before typesetting the footnote number. + \unskip + \thisfootno\@sf + \dofootnote +}% + +% Don't bother with the trickery in plain.tex to not require the +% footnote text as a parameter. Our footnotes don't need to be so general. +% +% Oh yes, they do; otherwise, @ifset (and anything else that uses +% \parseargline) fails inside footnotes because the tokens are fixed when +% the footnote is read. --karl, 16nov96. +% +\gdef\dofootnote{% + \insert\footins\bgroup + % We want to typeset this text as a normal paragraph, even if the + % footnote reference occurs in (for example) a display environment. + % So reset some parameters. + \hsize=\pagewidth + \interlinepenalty\interfootnotelinepenalty + \splittopskip\ht\strutbox % top baseline for broken footnotes + \splitmaxdepth\dp\strutbox + \floatingpenalty\@MM + \leftskip\z@skip + \rightskip\z@skip + \spaceskip\z@skip + \xspaceskip\z@skip + \parindent\defaultparindent + % + \smallfonts \rm + % + % Because we use hanging indentation in footnotes, a @noindent appears + % to exdent this text, so make it be a no-op. makeinfo does not use + % hanging indentation so @noindent can still be needed within footnote + % text after an @example or the like (not that this is good style). + \let\noindent = \relax + % + % Hang the footnote text off the number. Use \everypar in case the + % footnote extends for more than one paragraph. + \everypar = {\hang}% + \textindent{\thisfootno}% + % + % Don't crash into the line above the footnote text. Since this + % expands into a box, it must come within the paragraph, lest it + % provide a place where TeX can split the footnote. + \footstrut + \futurelet\next\fo@t +} +}%end \catcode `\@=11 + +% In case a @footnote appears in a vbox, save the footnote text and create +% the real \insert just after the vbox finished. Otherwise, the insertion +% would be lost. +% Similarily, if a @footnote appears inside an alignment, save the footnote +% text to a box and make the \insert when a row of the table is finished. +% And the same can be done for other insert classes. --kasal, 16nov03. + +% Replace the \insert primitive by a cheating macro. +% Deeper inside, just make sure that the saved insertions are not spilled +% out prematurely. +% +\def\startsavinginserts{% + \ifx \insert\ptexinsert + \let\insert\saveinsert + \else + \let\checkinserts\relax + \fi +} + +% This \insert replacement works for both \insert\footins{foo} and +% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. +% +\def\saveinsert#1{% + \edef\next{\noexpand\savetobox \makeSAVEname#1}% + \afterassignment\next + % swallow the left brace + \let\temp = +} +\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} +\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} + +\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} + +\def\placesaveins#1{% + \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname + {\box#1}% +} + +% eat @SAVE -- beware, all of them have catcode \other: +{ + \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) + \gdef\gobblesave @SAVE{} +} + +% initialization: +\def\newsaveins #1{% + \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% + \next +} +\def\newsaveinsX #1{% + \csname newbox\endcsname #1% + \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts + \checksaveins #1}% +} + +% initialize: +\let\checkinserts\empty +\newsaveins\footins +\newsaveins\margin + + +% @image. We use the macros from epsf.tex to support this. +% If epsf.tex is not installed and @image is used, we complain. +% +% Check for and read epsf.tex up front. If we read it only at @image +% time, we might be inside a group, and then its definitions would get +% undone and the next image would fail. +\openin 1 = epsf.tex +\ifeof 1 \else + % Do not bother showing banner with epsf.tex v2.7k (available in + % doc/epsf.tex and on ctan). + \def\epsfannounce{\toks0 = }% + \input epsf.tex +\fi +\closein 1 +% +% We will only complain once about lack of epsf.tex. +\newif\ifwarnednoepsf +\newhelp\noepsfhelp{epsf.tex must be installed for images to + work. It is also included in the Texinfo distribution, or you can get + it from ftp://tug.org/tex/epsf.tex.} +% +\def\image#1{% + \ifx\epsfbox\undefined + \ifwarnednoepsf \else + \errhelp = \noepsfhelp + \errmessage{epsf.tex not found, images will be ignored}% + \global\warnednoepsftrue + \fi + \else + \imagexxx #1,,,,,\finish + \fi +} +% +% Arguments to @image: +% #1 is (mandatory) image filename; we tack on .eps extension. +% #2 is (optional) width, #3 is (optional) height. +% #4 is (ignored optional) html alt text. +% #5 is (ignored optional) extension. +% #6 is just the usual extra ignored arg for parsing this stuff. +\newif\ifimagevmode +\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup + \catcode`\^^M = 5 % in case we're inside an example + \normalturnoffactive % allow _ et al. in names + % If the image is by itself, center it. + \ifvmode + \imagevmodetrue + \nobreak\bigskip + % Usually we'll have text after the image which will insert + % \parskip glue, so insert it here too to equalize the space + % above and below. + \nobreak\vskip\parskip + \nobreak + \line\bgroup\hss + \fi + % + % Output the image. + \ifpdf + \dopdfimage{#1}{#2}{#3}% + \else + % \epsfbox itself resets \epsf?size at each figure. + \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi + \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi + \epsfbox{#1.eps}% + \fi + % + \ifimagevmode \hss \egroup \bigbreak \fi % space after the image +\endgroup} + + +% @float FLOATTYPE,LOC ... @end float for displayed figures, tables, etc. +% We don't actually implement floating yet, we just plop the float "here". +% But it seemed the best name for the future. +% +\envparseargdef\float{\dofloat #1,,,\finish} + +% #1 is the optional FLOATTYPE, the text label for this float, typically +% "Figure", "Table", "Example", etc. Can't contain commas. If omitted, +% this float will not be numbered and cannot be referred to. +% +% #2 is the optional xref label. Also must be present for the float to +% be referable. +% +% #3 is the optional positioning argument; for now, it is ignored. It +% will somehow specify the positions allowed to float to (here, top, bottom). +% +% We keep a separate counter for each FLOATTYPE, which we reset at each +% chapter-level command. +\let\resetallfloatnos=\empty +% +\def\dofloat#1,#2,#3,#4\finish{% + \let\thiscaption=\empty + \let\thisshortcaption=\empty + % + % don't lose footnotes inside @float. + \startsavinginserts + % + % We can't be used inside a paragraph. + \par + % + \vtop\bgroup + \def\floattype{#1}% + \def\floatlabel{#2}% + \def\floatloc{#3}% we do nothing with this yet. + % + \ifx\floattype\empty + \let\safefloattype=\empty + \else + {% + % the floattype might have accents or other special characters, + % but we need to use it in a control sequence name. + \indexnofonts + \turnoffactive + \xdef\safefloattype{\floattype}% + }% + \fi + % + % If label is given but no type, we handle that as the empty type. + \ifx\floatlabel\empty \else + % We want each FLOATTYPE to be numbered separately (Figure 1, + % Table 1, Figure 2, ...). (And if no label, no number.) + % + \expandafter\getfloatno\csname\safefloattype floatno\endcsname + \global\advance\floatno by 1 + % + {% + % This magic value for \thissection is output by \setref as the + % XREFLABEL-title value. \xrefX uses it to distinguish float + % labels (which have a completely different output format) from + % node and anchor labels. And \xrdef uses it to construct the + % lists of floats. + % + \edef\thissection{\floatmagic=\safefloattype}% + \setref{\floatlabel}{Yfloat}% + }% + \fi + % + % start with \parskip glue, I guess. + \vskip\parskip + % + % Don't suppress indentation if a float happens to start a section. + \restorefirstparagraphindent +} + +% we have these possibilities: +% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap +% @float Foo,lbl & no caption: Foo 1.1 +% @float Foo & @caption{Cap}: Foo: Cap +% @float Foo & no caption: Foo +% @float ,lbl & Caption{Cap}: 1.1: Cap +% @float ,lbl & no caption: 1.1 +% @float & @caption{Cap}: Cap +% @float & no caption: +% +\def\Efloat{% + \let\floatident = \empty + % + % In all cases, if we have a float type, it comes first. + \ifx\floattype\empty \else \def\floatident{\floattype}\fi + % + % If we have an xref label, the number comes next. + \ifx\floatlabel\empty \else + \ifx\floattype\empty \else % if also had float type, need tie first. + \appendtomacro\floatident{\tie}% + \fi + % the number. + \appendtomacro\floatident{\chaplevelprefix\the\floatno}% + \fi + % + % Start the printed caption with what we've constructed in + % \floatident, but keep it separate; we need \floatident again. + \let\captionline = \floatident + % + \ifx\thiscaption\empty \else + \ifx\floatident\empty \else + \appendtomacro\captionline{: }% had ident, so need a colon between + \fi + % + % caption text. + \appendtomacro\captionline\thiscaption + \fi + % + % If we have anything to print, print it, with space before. + % Eventually this needs to become an \insert. + \ifx\captionline\empty \else + \vskip.5\parskip + \captionline + \fi + % + % If have an xref label, write the list of floats info. Do this + % after the caption, to avoid chance of it being a breakpoint. + \ifx\floatlabel\empty \else + % Write the text that goes in the lof to the aux file as + % \floatlabel-lof. Besides \floatident, we include the short + % caption if specified, else the full caption if specified, else nothing. + {% + \atdummies \turnoffactive \otherbackslash + \immediate\write\auxfile{@xrdef{\floatlabel-lof}{% + \floatident + \ifx\thisshortcaption\empty + \ifx\thiscaption\empty \else : \thiscaption \fi + \else + : \thisshortcaption + \fi + }}% + }% + \fi + % + % Space below caption, if we printed anything. + \ifx\printedsomething\empty \else \vskip\parskip \fi + \egroup % end of \vtop + \checkinserts +} + +% Append the tokens #2 to the definition of macro #1, not expanding either. +% +\newtoks\appendtomacroAtoks +\newtoks\appendtomacroBtoks +\def\appendtomacro#1#2{% + \appendtomacroAtoks = \expandafter{#1}% + \appendtomacroBtoks = {#2}% + \edef#1{\the\appendtomacroAtoks \the\appendtomacroBtoks}% +} + +% @caption, @shortcaption are easy. +% +\long\def\caption#1{\checkenv\float \def\thiscaption{#1}} +\def\shortcaption#1{\checkenv\float \def\thisshortcaption{#1}} + +% The parameter is the control sequence identifying the counter we are +% going to use. Create it if it doesn't exist and assign it to \floatno. +\def\getfloatno#1{% + \ifx#1\relax + % Haven't seen this figure type before. + \csname newcount\endcsname #1% + % + % Remember to reset this floatno at the next chap. + \expandafter\gdef\expandafter\resetallfloatnos + \expandafter{\resetallfloatnos #1=0 }% + \fi + \let\floatno#1% +} + +% \setref calls this to get the XREFLABEL-snt value. We want an @xref +% to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we +% first read the @float command. +% +\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% + +% Magic string used for the XREFLABEL-title value, so \xrefX can +% distinguish floats from other xref types. +\def\floatmagic{!!float!!} + +% #1 is the control sequence we are passed; we expand into a conditional +% which is true if #1 represents a float ref. That is, the magic +% \thissection value which we \setref above. +% +\def\iffloat#1{\expandafter\doiffloat#1==\finish} +% +% #1 is (maybe) the \floatmagic string. If so, #2 will be the +% (safe) float type for this float. We set \iffloattype to #2. +% +\def\doiffloat#1=#2=#3\finish{% + \def\temp{#1}% + \def\iffloattype{#2}% + \ifx\temp\floatmagic +} + +% @listoffloats FLOATTYPE - print a list of floats like a table of contents. +% +\parseargdef\listoffloats{% + \def\floattype{#1}% floattype + {% + % the floattype might have accents or other special characters, + % but we need to use it in a control sequence name. + \indexnofonts + \turnoffactive + \xdef\safefloattype{\floattype}% + }% + % + % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. + \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax + \ifhavexrefs + % if the user said @listoffloats foo but never @float foo. + \message{\linenumber No `\safefloattype' floats to list.}% + \fi + \else + \begingroup + \leftskip=\tocindent % indent these entries like a toc + \let\do=\listoffloatsdo + \csname floatlist\safefloattype\endcsname + \endgroup + \fi +} + +% This is called on each entry in a list of floats. We're passed the +% xref label, in the form LABEL-title, which is how we save it in the +% aux file. We strip off the -title and look up \XRLABEL-lof, which +% has the text we're supposed to typeset here. +% +% Figures without xref labels will not be included in the list (since +% they won't appear in the aux file). +% +\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} +\def\listoffloatsdoentry#1-title\finish{{% + % Can't fully expand XR#1-lof because it can contain anything. Just + % pass the control sequence. On the other hand, XR#1-pg is just the + % page number, and we want to fully expand that so we can get a link + % in pdf output. + \toksA = \expandafter{\csname XR#1-lof\endcsname}% + % + % use the same \entry macro we use to generate the TOC and index. + \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% + \writeentry +}} + +\message{localization,} +% and i18n. + +% @documentlanguage is usually given very early, just after +% @setfilename. If done too late, it may not override everything +% properly. Single argument is the language abbreviation. +% It would be nice if we could set up a hyphenation file here. +% +\parseargdef\documentlanguage{% + \tex % read txi-??.tex file in plain TeX. + % Read the file if it exists. + \openin 1 txi-#1.tex + \ifeof 1 + \errhelp = \nolanghelp + \errmessage{Cannot read language file txi-#1.tex}% + \else + \input txi-#1.tex + \fi + \closein 1 + \endgroup +} +\newhelp\nolanghelp{The given language definition file cannot be found or +is empty. Maybe you need to install it? In the current directory +should work if nowhere else does.} + + +% @documentencoding should change something in TeX eventually, most +% likely, but for now just recognize it. +\let\documentencoding = \comment + + +% Page size parameters. +% +\newdimen\defaultparindent \defaultparindent = 15pt + +\chapheadingskip = 15pt plus 4pt minus 2pt +\secheadingskip = 12pt plus 3pt minus 2pt +\subsecheadingskip = 9pt plus 2pt minus 2pt + +% Prevent underfull vbox error messages. +\vbadness = 10000 + +% Don't be so finicky about underfull hboxes, either. +\hbadness = 2000 + +% Following George Bush, just get rid of widows and orphans. +\widowpenalty=10000 +\clubpenalty=10000 + +% Use TeX 3.0's \emergencystretch to help line breaking, but if we're +% using an old version of TeX, don't do anything. We want the amount of +% stretch added to depend on the line length, hence the dependence on +% \hsize. We call this whenever the paper size is set. +% +\def\setemergencystretch{% + \ifx\emergencystretch\thisisundefined + % Allow us to assign to \emergencystretch anyway. + \def\emergencystretch{\dimen0}% + \else + \emergencystretch = .15\hsize + \fi +} + +% Parameters in order: 1) textheight; 2) textwidth; 3) voffset; +% 4) hoffset; 5) binding offset; 6) topskip; 7) physical page height; 8) +% physical page width. +% +% We also call \setleading{\textleading}, so the caller should define +% \textleading. The caller should also set \parskip. +% +\def\internalpagesizes#1#2#3#4#5#6#7#8{% + \voffset = #3\relax + \topskip = #6\relax + \splittopskip = \topskip + % + \vsize = #1\relax + \advance\vsize by \topskip + \outervsize = \vsize + \advance\outervsize by 2\topandbottommargin + \pageheight = \vsize + % + \hsize = #2\relax + \outerhsize = \hsize + \advance\outerhsize by 0.5in + \pagewidth = \hsize + % + \normaloffset = #4\relax + \bindingoffset = #5\relax + % + \ifpdf + \pdfpageheight #7\relax + \pdfpagewidth #8\relax + \fi + % + \setleading{\textleading} + % + \parindent = \defaultparindent + \setemergencystretch +} + +% @letterpaper (the default). +\def\letterpaper{{\globaldefs = 1 + \parskip = 3pt plus 2pt minus 1pt + \textleading = 13.2pt + % + % If page is nothing but text, make it come out even. + \internalpagesizes{46\baselineskip}{6in}% + {\voffset}{.25in}% + {\bindingoffset}{36pt}% + {11in}{8.5in}% +}} + +% Use @smallbook to reset parameters for 7x9.5 (or so) format. +\def\smallbook{{\globaldefs = 1 + \parskip = 2pt plus 1pt + \textleading = 12pt + % + \internalpagesizes{7.5in}{5in}% + {\voffset}{.25in}% + {\bindingoffset}{16pt}% + {9.25in}{7in}% + % + \lispnarrowing = 0.3in + \tolerance = 700 + \hfuzz = 1pt + \contentsrightmargin = 0pt + \defbodyindent = .5cm +}} + +% Use @afourpaper to print on European A4 paper. +\def\afourpaper{{\globaldefs = 1 + \parskip = 3pt plus 2pt minus 1pt + \textleading = 13.2pt + % + % Double-side printing via postscript on Laserjet 4050 + % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. + % To change the settings for a different printer or situation, adjust + % \normaloffset until the front-side and back-side texts align. Then + % do the same for \bindingoffset. You can set these for testing in + % your texinfo source file like this: + % @tex + % \global\normaloffset = -6mm + % \global\bindingoffset = 10mm + % @end tex + \internalpagesizes{51\baselineskip}{160mm} + {\voffset}{\hoffset}% + {\bindingoffset}{44pt}% + {297mm}{210mm}% + % + \tolerance = 700 + \hfuzz = 1pt + \contentsrightmargin = 0pt + \defbodyindent = 5mm +}} + +% Use @afivepaper to print on European A5 paper. +% From romildo@urano.iceb.ufop.br, 2 July 2000. +% He also recommends making @example and @lisp be small. +\def\afivepaper{{\globaldefs = 1 + \parskip = 2pt plus 1pt minus 0.1pt + \textleading = 12.5pt + % + \internalpagesizes{160mm}{120mm}% + {\voffset}{\hoffset}% + {\bindingoffset}{8pt}% + {210mm}{148mm}% + % + \lispnarrowing = 0.2in + \tolerance = 800 + \hfuzz = 1.2pt + \contentsrightmargin = 0pt + \defbodyindent = 2mm + \tableindent = 12mm +}} + +% A specific text layout, 24x15cm overall, intended for A4 paper. +\def\afourlatex{{\globaldefs = 1 + \afourpaper + \internalpagesizes{237mm}{150mm}% + {\voffset}{4.6mm}% + {\bindingoffset}{7mm}% + {297mm}{210mm}% + % + % Must explicitly reset to 0 because we call \afourpaper. + \globaldefs = 0 +}} + +% Use @afourwide to print on A4 paper in landscape format. +\def\afourwide{{\globaldefs = 1 + \afourpaper + \internalpagesizes{241mm}{165mm}% + {\voffset}{-2.95mm}% + {\bindingoffset}{7mm}% + {297mm}{210mm}% + \globaldefs = 0 +}} + +% @pagesizes TEXTHEIGHT[,TEXTWIDTH] +% Perhaps we should allow setting the margins, \topskip, \parskip, +% and/or leading, also. Or perhaps we should compute them somehow. +% +\parseargdef\pagesizes{\pagesizesyyy #1,,\finish} +\def\pagesizesyyy#1,#2,#3\finish{{% + \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi + \globaldefs = 1 + % + \parskip = 3pt plus 2pt minus 1pt + \setleading{\textleading}% + % + \dimen0 = #1 + \advance\dimen0 by \voffset + % + \dimen2 = \hsize + \advance\dimen2 by \normaloffset + % + \internalpagesizes{#1}{\hsize}% + {\voffset}{\normaloffset}% + {\bindingoffset}{44pt}% + {\dimen0}{\dimen2}% +}} + +% Set default to letter. +% +\letterpaper + + +\message{and turning on texinfo input format.} + +% Define macros to output various characters with catcode for normal text. +\catcode`\"=\other +\catcode`\~=\other +\catcode`\^=\other +\catcode`\_=\other +\catcode`\|=\other +\catcode`\<=\other +\catcode`\>=\other +\catcode`\+=\other +\catcode`\$=\other +\def\normaldoublequote{"} +\def\normaltilde{~} +\def\normalcaret{^} +\def\normalunderscore{_} +\def\normalverticalbar{|} +\def\normalless{<} +\def\normalgreater{>} +\def\normalplus{+} +\def\normaldollar{$}%$ font-lock fix + +% This macro is used to make a character print one way in \tt +% (where it can probably be output as-is), and another way in other fonts, +% where something hairier probably needs to be done. +% +% #1 is what to print if we are indeed using \tt; #2 is what to print +% otherwise. Since all the Computer Modern typewriter fonts have zero +% interword stretch (and shrink), and it is reasonable to expect all +% typewriter fonts to have this, we can check that font parameter. +% +\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} + +% Same as above, but check for italic font. Actually this also catches +% non-italic slanted fonts since it is impossible to distinguish them from +% italic fonts. But since this is only used by $ and it uses \sl anyway +% this is not a problem. +\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} + +% Turn off all special characters except @ +% (and those which the user can use as if they were ordinary). +% Most of these we simply print from the \tt font, but for some, we can +% use math or other variants that look better in normal text. + +\catcode`\"=\active +\def\activedoublequote{{\tt\char34}} +\let"=\activedoublequote +\catcode`\~=\active +\def~{{\tt\char126}} +\chardef\hat=`\^ +\catcode`\^=\active +\def^{{\tt \hat}} + +\catcode`\_=\active +\def_{\ifusingtt\normalunderscore\_} +% Subroutine for the previous macro. +\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } + +\catcode`\|=\active +\def|{{\tt\char124}} +\chardef \less=`\< +\catcode`\<=\active +\def<{{\tt \less}} +\chardef \gtr=`\> +\catcode`\>=\active +\def>{{\tt \gtr}} +\catcode`\+=\active +\def+{{\tt \char 43}} +\catcode`\$=\active +\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix + +% If a .fmt file is being used, characters that might appear in a file +% name cannot be active until we have parsed the command line. +% So turn them off again, and have \everyjob (or @setfilename) turn them on. +% \otherifyactive is called near the end of this file. +\def\otherifyactive{\catcode`+=\other \catcode`\_=\other} + +\catcode`\@=0 + +% \backslashcurfont outputs one backslash character in current font, +% as in \char`\\. +\global\chardef\backslashcurfont=`\\ +\global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work + +% \rawbackslash defines an active \ to do \backslashcurfont. +% \otherbackslash defines an active \ to be a literal `\' character with +% catcode other. +{\catcode`\\=\active + @gdef@rawbackslash{@let\=@backslashcurfont} + @gdef@otherbackslash{@let\=@realbackslash} +} + +% \realbackslash is an actual character `\' with catcode other. +{\catcode`\\=\other @gdef@realbackslash{\}} + +% \normalbackslash outputs one backslash in fixed width font. +\def\normalbackslash{{\tt\backslashcurfont}} + +\catcode`\\=\active + +% Used sometimes to turn off (effectively) the active characters +% even after parsing them. +@def@turnoffactive{% + @let"=@normaldoublequote + @let\=@realbackslash + @let~=@normaltilde + @let^=@normalcaret + @let_=@normalunderscore + @let|=@normalverticalbar + @let<=@normalless + @let>=@normalgreater + @let+=@normalplus + @let$=@normaldollar %$ font-lock fix + @unsepspaces +} + +% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of +% the literal character `\'. (Thus, \ is not expandable when this is in +% effect.) +% +@def@normalturnoffactive{@turnoffactive @let\=@normalbackslash} + +% Make _ and + \other characters, temporarily. +% This is canceled by @fixbackslash. +@otherifyactive + +% If a .fmt file is being used, we don't want the `\input texinfo' to show up. +% That is what \eatinput is for; after that, the `\' should revert to printing +% a backslash. +% +@gdef@eatinput input texinfo{@fixbackslash} +@global@let\ = @eatinput + +% On the other hand, perhaps the file did not have a `\input texinfo'. Then +% the first `\{ in the file would cause an error. This macro tries to fix +% that, assuming it is called before the first `\' could plausibly occur. +% Also back turn on active characters that might appear in the input +% file name, in case not using a pre-dumped format. +% +@gdef@fixbackslash{% + @ifx\@eatinput @let\ = @normalbackslash @fi + @catcode`+=@active + @catcode`@_=@active +} + +% Say @foo, not \foo, in error messages. +@escapechar = `@@ + +% These look ok in all fonts, so just make them not special. +@catcode`@& = @other +@catcode`@# = @other +@catcode`@% = @other + + +@c Local variables: +@c eval: (add-hook 'write-file-hooks 'time-stamp) +@c page-delimiter: "^\\\\message" +@c time-stamp-start: "def\\\\texinfoversion{" +@c time-stamp-format: "%:y-%02m-%02d.%02H" +@c time-stamp-end: "}" +@c End: + +@c vim:sw=2: + +@ignore + arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 +@end ignore diff --git a/doc/threads.texi b/doc/threads.texi new file mode 100644 index 0000000..a6e17e6 --- /dev/null +++ b/doc/threads.texi @@ -0,0 +1,501 @@ +@node Task 1--Threads +@chapter Task 1: Scheduling + +In this assignment, we give you a minimally functional thread system. +Your job is to extend the functionality of this system to gain a +better understanding of synchronization problems. + +You will be working primarily in the @file{threads} directory for +this assignment. Compilation should be done in the @file{threads} directory. + +Before you read the description of this task, you should read all of +the following sections: @ref{Introduction}, @ref{Task 0--Codebase}, @ref{Coding Standards}, +@ref{Debugging Tools}, and @ref{Development Tools}. You should at least +skim the material from @ref{PintOS Loading} through @ref{Memory +Allocation}, especially @ref{Synchronization}. To complete this task +you will also need to read @ref{4.4BSD Scheduler}. + +You must build task 1 on top of a working task 0 submission +as some of the task 1 test rely on a non-busy waiting implementation of @code{timer_sleep()}. + +@menu +* Background:: +* Development Suggestions:: +* Task 1 Requirements:: +* Task 1 FAQ:: +@end menu + +@node Background +@section Background + +Now that you've become familiar with PintOS and its thread package, it's time to work on one of the most critical component of an operating system: the scheduler. + +Working on the scheduler requires you to have grasped the main concepts of both the threading system and synchronization primitives. If you still feel uncertain about these topics, you are warmly invited to refer back to @ref{Understanding Threads} and @ref{Synchronization} and to carefully read the code in the corresponding source files. + +@node Development Suggestions +@section Development Suggestions + +In the past, many groups divided the assignment into pieces, then each +group member worked on his or her piece until just before the +deadline, at which time the group reconvened to combine their code and +submit. @strong{This is a bad idea. We do not recommend this +approach.} Groups that do this often find that two changes conflict +with each other, requiring lots of last-minute debugging. Some groups +who have done this have turned in code that did not even compile or +boot, much less pass any tests. + +@localgitpolicy{} + +You should expect to run into bugs that you simply don't understand +while working on this and subsequent tasks. When you do, +reread the appendix on debugging tools, which is filled with +useful debugging tips that should help you to get back up to speed +(@pxref{Debugging Tools}). Be sure to read the section on backtraces +(@pxref{Backtraces}), which will help you to get the most out of every +kernel panic or assertion failure. + +@node Task 1 Requirements +@section Requirements + +@menu +* Task 1 Design Document:: +* Setting and Inspecting Priorities:: +* Priority Scheduling:: +* Priority Donation:: +* Advanced Scheduler:: +@end menu + +@node Task 1 Design Document +@subsection Design Document + +When you submit your work for task 1, you must also submit a completed copy of +@uref{threads.tmpl, , the task 1 design document}. +You can find a template design document for this task in @file{pintos/doc/threads.tmpl} and also on CATe. +You are free to submit your design document as either a @file{.txt} or @file{.pdf} file. +We recommend that you read the design document template before you start working on the task. +@xref{Task Documentation}, for a sample design document that goes along with a fictitious task. + +@node Setting and Inspecting Priorities +@subsection Setting and Inspecting Priorities + +Implement the following functions that allow a thread to examine and modify its own priority. +Skeletons for these functions are provided in @file{threads/thread.c}. + +@deftypefun int thread_get_priority (void) +Returns the current thread's effective priority. +@end deftypefun + +@deftypefun void thread_set_priority (int @var{new_priority}) +Sets the current thread's priority to @var{new_priority}. + +If the current thread no longer has the highest priority, yields. +@end deftypefun + +@node Priority Scheduling +@subsection Priority Scheduling + +Implement priority scheduling in PintOS. +When a thread is added to the ready list that has a higher priority +than the currently running thread, the current thread should +immediately yield the processor to the new thread. Similarly, when +threads are waiting for a lock, semaphore, or condition variable, the +highest priority waiting thread should be awakened first. A thread +may raise or lower its own priority at any time, but lowering its +priority such that it no longer has the highest priority must cause it +to immediately yield the CPU. In both the priority scheduler and the +advanced scheduler you will write later, the running thread should +be that with the highest priority. + +Thread priorities range from @code{PRI_MIN} (0) to @code{PRI_MAX} (63). +Lower numbers correspond to lower priorities, so that priority 0 +is the lowest priority and priority 63 is the highest. +The initial thread priority is passed as an argument to +@func{thread_create}. If there's no reason to choose another +priority, new threads should use @code{PRI_DEFAULT} (31). The @code{PRI_} macros are +defined in @file{threads/thread.h}, and you should not change their +values. + +@node Priority Donation +@subsection Priority Donation + +One issue with priority scheduling is ``priority inversion''. Consider +high, medium, and low priority threads @var{H}, @var{M}, and @var{L}, +respectively. If @var{H} needs to wait for @var{L} (for instance, for a +lock held by @var{L}), and @var{M} is on the ready list, then @var{H} +will never get the CPU because the low priority thread will not get any +CPU time. A partial fix for this problem is for @var{H} to ``donate'' +its priority to @var{L} while @var{L} is holding the lock, then recall +the donation once @var{L} releases (and thus @var{H} acquires) the lock. + +Implement priority donation. You will need to account for all different +situations in which priority donation is required. In particular, be sure to handle: + +@itemize + +@item @strong{multiple donations}: multiple priorities can be donated to a single thread. +@item @strong{nested donations}: if @var{H} is waiting on +a lock that @var{M} holds and @var{M} is waiting on a lock that @var{L} +holds, then both @var{M} and @var{L} should be boosted to @var{H}'s +priority. If necessary, you may impose a reasonable limit on depth of +nested priority donation, such as 8 levels. + +@end itemize + +You must implement priority donation for locks. +You do not need to implement priority donation for the other PintOS synchronization constructs. +However, you do need to implement priority scheduling in all cases. + +Finally, you should review your implementations of @code{thread_get_priority} and @code{thread_set_priority} +to make sure that they exhibit the correct behaviour in the presence of dontations. +In particular, in the presence of priority donations @code{thread_get_priority} must return the highest donated priority. + +You do not need to provide any interface to allow a thread to directly modify other threads' priorities. +The priority scheduler is also not used in any later task. + +@node Advanced Scheduler +@subsection Advanced Scheduler + +Implement a multilevel feedback queue scheduler similar to the +4.4@acronym{BSD} scheduler to +reduce the average response time for running jobs on your system. +@xref{4.4BSD Scheduler}, for detailed requirements. + +Like the priority scheduler, the advanced scheduler chooses the thread +to run based on priorities. However, the advanced scheduler does not do +priority donation. Thus, we recommend that you have the priority +scheduler working, except possibly for priority donation, before you +start work on the advanced scheduler. + +You must write your code to allow us to choose a scheduling algorithm +policy at PintOS startup time. By default, the priority scheduler +must be active, but we must be able to choose the 4.4@acronym{BSD} +scheduler +with the @option{-mlfqs} kernel option. Passing this +option sets @code{thread_mlfqs}, declared in @file{threads/thread.h}, to +true when the options are parsed by @func{parse_options}, which happens +early in @func{main}. + +When the 4.4@acronym{BSD} scheduler is enabled, threads no longer +directly control their own priorities. The @var{priority} argument to +@func{thread_create} should be ignored, as well as any calls to +@func{thread_set_priority}, and @func{thread_get_priority} should return +the thread's current priority as set by the scheduler. + +The advanced scheduler is not used in any later task. + +@node Task 1 FAQ +@section FAQ + +@table @b +@item How much code will I need to write? + +Here's a summary of our reference solution, produced by the +@command{diffstat} program. The final row gives total lines inserted +and deleted; a changed line counts as both an insertion and a deletion. + +@verbatim + threads/fixed-point.h | 120 ++++++++++++++++++ + threads/synch.c | 88 ++++++++++++- + threads/thread.c | 196 ++++++++++++++++++++++++++---- + threads/thread.h | 19 ++ + 4 files changed, 397 insertions(+), 26 deletions(-) +@end verbatim + +The reference solution represents just one possible solution. Many +other solutions are also possible and many of those differ greatly from +the reference solution. Some excellent solutions may not modify all the +files modified by the reference solution, and some may modify files not +modified by the reference solution. + +@file{fixed-point.h} is a new file added by the reference solution. + +@item Do we need a working Task 0 to implement Task 1? + +Yes. + +@item How do I update the @file{Makefile}s when I add a new source file? + +@anchor{Adding Source Files} +To add a @file{.c} file, edit the top-level @file{Makefile.build}. +Add the new file to variable @samp{@var{dir}_SRC}, where +@var{dir} is the directory where you added the file. For this +task, that means you should add it to @code{threads_SRC} or +@code{devices_SRC}. Then run @code{make}. If your new file +doesn't get +compiled, run @code{make clean} and then try again. + +When you modify the top-level @file{Makefile.build} and re-run +@command{make}, the modified +version should be automatically copied to +@file{threads/build/Makefile}. The converse is +not true, so any changes will be lost the next time you run @code{make +clean} from the @file{threads} directory. Unless your changes are +truly temporary, you should prefer to edit @file{Makefile.build}. + +A new @file{.h} file does not require editing the @file{Makefile}s. + +@item What does @code{warning: no previous prototype for `@var{func}'} mean? + +It means that you defined a non-@code{static} function without +preceding it by a prototype. Because non-@code{static} functions are +intended for use by other @file{.c} files, for safety they should be +prototyped in a header file included before their definition. To fix +the problem, add a prototype in a header file that you include, or, if +the function isn't actually used by other @file{.c} files, make it +@code{static}. + +@item What is the interval between timer interrupts? + +Timer interrupts occur @code{TIMER_FREQ} times per second. You can +adjust this value by editing @file{devices/timer.h}. The default is +100 Hz. + +We don't recommend changing this value, because any changes are likely +to cause many of the tests to fail. + +@item How long is a time slice? + +There are @code{TIME_SLICE} ticks per time slice. This macro is +declared in @file{threads/thread.c}. The default is 4 ticks. + +We don't recommend changing this value, because any changes are likely +to cause many of the tests to fail. + +@item How do I run the tests? + +@xref{Testing}. + +@item Why do I get a test failure in @func{pass}? + +@anchor{The pass function fails} +You are probably looking at a backtrace that looks something like this: + +@example +0xc0108810: debug_panic (lib/kernel/debug.c:32) +0xc010a99f: pass (tests/threads/tests.c:93) +0xc010bdd3: test_mlfqs_load_1 (...threads/mlfqs-load-1.c:33) +0xc010a8cf: run_test (tests/threads/tests.c:51) +0xc0100452: run_task (threads/init.c:283) +0xc0100536: run_actions (threads/init.c:333) +0xc01000bb: main (threads/init.c:137) +@end example + +This is just confusing output from the @command{backtrace} program. It +does not actually mean that @func{pass} called @func{debug_panic}. In +fact, @func{fail} called @func{debug_panic} (via the @func{PANIC} +macro). GCC knows that @func{debug_panic} does not return, because it +is declared @code{NO_RETURN} (@pxref{Function and Parameter +Attributes}), so it doesn't include any code in @func{fail} to take +control when @func{debug_panic} returns. This means that the return +address on the stack looks like it is at the beginning of the function +that happens to follow @func{fail} in memory, which in this case happens +to be @func{pass}. + +@xref{Backtraces}, for more information. + +@item How do interrupts get re-enabled in the new thread following @func{schedule}? + +Every path into @func{schedule} disables interrupts. They eventually +get re-enabled by the next thread to be scheduled. Consider the +possibilities: the new thread is running in @func{switch_thread} (but +see below), which is called by @func{schedule}, which is called by one +of a few possible functions: + +@itemize @bullet +@item +@func{thread_exit}, but we'll never switch back into such a thread, so +it's uninteresting. + +@item +@func{thread_yield}, which immediately restores the interrupt level upon +return from @func{schedule}. + +@item +@func{thread_block}, which is called from multiple places: + +@itemize @minus +@item +@func{sema_down}, which restores the interrupt level before returning. + +@item +@func{idle}, which enables interrupts with an explicit assembly STI +instruction. + +@item +@func{wait} in @file{devices/intq.c}, whose callers are responsible for +re-enabling interrupts. +@end itemize +@end itemize + +There is a special case when a newly created thread runs for the first +time. Such a thread calls @func{intr_enable} as the first action in +@func{kernel_thread}, which is at the bottom of the call stack for every +kernel thread but the first. + +@item What should I expect from the Task 1 code-review? + +The code-review for this task will be conducted with each group in-person. +Our Task 1 code-review will cover @strong{four} main areas: +functional correctness, efficiency, design quality and general coding style. + +@itemize @bullet +@item For @strong{functional correctness}, we will be looking to see if your implementation of priority scheduling strictly obeys the rule that "the highest priority ready thread will always be running" and that all cases of priority inversion are being correctly handled by your system for priority donations. +We will also be checking if your updated code for locks is free of any race conditions, paying specific attention to the @func{lock_acquire} and @func{lock_release} functions, as well as the interplay between them. + +@item For @strong{efficiency}, we will be looking at the complexity characteristics of your modified code for semaphores, as well +the steps you have taken to minimise the time spent inside your timer interrupt handler. + +@item For @strong{design quality}, we will be looking at the stability and robustness of any changes you have made to the core PintOS kernel (e.g. @func{thread_block}, @func{thread_unblock} and @func{thread_yield}) and the accuracy of the priority updates in your BSD scheduler. + +@item For @strong{general coding style}, we will be paying attention to all of the usual elements of good style +that you should be used to from last year (e.g. consistent code layout, appropriate use of comments, avoiding magic numbers, etc.) +as well as your use of git (e.g. commit frequency and commit message quality). +In this task, we will be paying particular attention to the readability of your fixed-point mathematics abstraction within your BSD scheduler. +@end itemize +@end table + +@menu +* Priority Scheduling FAQ:: +* Advanced Scheduler FAQ:: +@end menu + +@node Priority Scheduling FAQ +@subsection Priority Scheduling FAQ + +@table @b +@item Doesn't priority scheduling lead to starvation? + +Yes, strict priority scheduling can lead to starvation +because a thread will not run if any higher-priority thread is runnable. +The advanced scheduler introduces a mechanism for dynamically +changing thread priorities. + +Strict priority scheduling is valuable in real-time systems because it +offers the programmer more control over which jobs get processing +time. High priorities are generally reserved for time-critical +tasks. It's not ``fair,'' but it addresses other concerns not +applicable to a general-purpose operating system. + +@item What thread should run after a lock has been released? + +When a lock is released, the highest priority thread waiting for that +lock should be unblocked and put on the list of ready threads. +The scheduler should then run the highest priority thread on the ready list. + +@item If the highest-priority thread yields, does it continue running? + +Yes. If there is a single highest-priority thread, it continues +running until it blocks or finishes, even if it calls +@func{thread_yield}. +If multiple threads have the same highest priority, +@func{thread_yield} should switch among them in ``round robin'' order. + +@item What happens to the priority of a donating thread? + +Priority donation only changes the priority of the donee +thread. The donor thread's priority is unchanged. +Priority donation is not additive: if thread @var{A} (with priority 5) donates +to thread @var{B} (with priority 3), then @var{B}'s new priority is 5, not 8. + +@item Can a thread's priority change while it is on the ready queue? + +Yes. Consider a ready, low-priority thread @var{L} that holds a lock. +High-priority thread @var{H} attempts to acquire the lock and blocks, +thereby donating its priority to ready thread @var{L}. + +@item Can a thread's priority change while it is blocked? + +Yes. While a thread that has acquired lock @var{L} is blocked for any +reason, its priority can increase by priority donation if a +higher-priority thread attempts to acquire @var{L}. This case is +checked by the @code{priority-donate-sema} test. + +@item Can a thread added to the ready list preempt the processor? + +Yes. If a thread added to the ready list has higher priority than the +running thread, the correct behaviour is to immediately yield the +processor. It is not acceptable to wait for the next timer interrupt. +The highest priority thread should run as soon as it is runnable, +preempting whatever thread is currently running. + +@item How does @func{thread_set_priority} affect a thread receiving donations? + +It sets the thread's base priority. The thread's effective priority +becomes the higher of the newly set priority or the highest donated +priority. When the donations are released, the thread's priority +becomes the one set through the function call. This behaviour is checked +by the @code{priority-donate-lower} test. + +@item Doubled test names in output make them fail. + +Suppose you are seeing output in which some test names are doubled, +like this: + +@example +(alarm-priority) begin +(alarm-priority) (alarm-priority) Thread priority 30 woke up. +Thread priority 29 woke up. +(alarm-priority) Thread priority 28 woke up. +@end example + +What is happening is that output from two threads is being +interleaved. That is, one thread is printing @code{"(alarm-priority) +Thread priority 29 woke up.\n"} and another thread is printing +@code{"(alarm-priority) Thread priority 30 woke up.\n"}, but the first +thread is being preempted by the second in the middle of its output. + +This problem indicates a bug in your priority scheduler. After all, a +thread with priority 29 should not be able to run while a thread with +priority 30 has work to do. + +Normally, the implementation of the @code{printf()} function in the +PintOS kernel attempts to prevent such interleaved output by acquiring +a console lock during the duration of the @code{printf} call and +releasing it afterwards. However, the output of the test name, +e.g., @code{(alarm-priority)}, and the message following it is output +using two calls to @code{printf}, resulting in the console lock being +acquired and released twice. +@end table + +@node Advanced Scheduler FAQ +@subsection Advanced Scheduler FAQ + +@table @b +@item How does priority donation interact with the advanced scheduler? + +It doesn't have to. We won't test priority donation and the advanced +scheduler at the same time. + +@item Can I use one queue instead of 64 queues? + +Yes. In general, your implementation may differ from the description, +as long as its behaviour is the same. + +@item Some scheduler tests fail and I don't understand why. Help! + +If your implementation mysteriously fails some of the advanced +scheduler tests, try the following: + +@itemize +@item +Read the source files for the tests that you're failing, to make sure +that you understand what's going on. Each one has a comment at the +top that explains its purpose and expected results. + +@item +Double-check your fixed-point arithmetic routines and your use of them +in the scheduler routines. + +@item +Consider how much work your implementation does in the timer +interrupt. If the timer interrupt handler takes too long, then it +will take away most of a timer tick from the thread that the timer +interrupt preempted. When it returns control to that thread, it +therefore won't get to do much work before the next timer interrupt +arrives. That thread will therefore get blamed for a lot more CPU +time than it actually got a chance to use. This raises the +interrupted thread's recent CPU count, thereby lowering its priority. +It can cause scheduling decisions to change. It also raises the load +average. +@end itemize +@end table diff --git a/doc/threads.tmpl b/doc/threads.tmpl new file mode 100644 index 0000000..5d79eea --- /dev/null +++ b/doc/threads.tmpl @@ -0,0 +1,108 @@ + +----------------------+ + | OS 211 | + | TASK 1: SCHEDULING | + | DESIGN DOCUMENT | + +----------------------+ + +---- GROUP ---- + +>> Fill in the names and email addresses of your group members. + +FirstName LastName +FirstName LastName +FirstName LastName + +---- PRELIMINARIES ---- + +>> If you have any preliminary comments on your submission, or notes for the +>> markers, please give them here. + +>> Please cite any offline or online sources you consulted while preparing your +>> submission, other than the PintOS documentation, course text, lecture notes +>> and course staff. + + PRIORITY SCHEDULING + =================== + +---- DATA STRUCTURES ---- + +>> A1: (2 marks) +>> Copy here the declaration of each new or changed `struct' or `struct' member, +>> global or static variable, `typedef', or enumeration. +>> Identify the purpose of each in roughly 25 words. + +>> A2: (4 marks) +>> Draw a diagram that illustrates a nested donation in your structure and +>> briefly explain how this works. + +---- ALGORITHMS ---- + +>> A3: (3 marks) +>> How do you ensure that the highest priority waiting thread wakes up first for +>> a (i) semaphore, (ii) lock, or (iii) condition variable? + +>> A4: (3 marks) +>> Describe the sequence of events when a call to lock_acquire() causes a +>> priority donation. +>> How is nested donation handled? + +>> A5: (3 marks) +>> Describe the sequence of events when lock_release() is called on a lock that +>> a higher-priority thread is waiting for. + +---- SYNCHRONIZATION ---- + +>> A6: (2 marks) +>> How do you avoid a race condition in thread_set_priority() when a thread +>> needs to recompute its effective priority, but the donated priorities +>> potentially change during the computation? +>> Can you use a lock to avoid the race? + +---- RATIONALE ---- + +>> A7: (3 marks) +>> Why did you choose this design? +>> In what ways is it superior to another design you considered? + + ADVANCED SCHEDULER + ================== + +---- DATA STRUCTURES ---- + +>> B1: (2 marks) +>> Copy here the declaration of each new or changed `struct' or `struct' member, +>> global or static variable, `typedef', or enumeration. +>> Identify the purpose of each in roughly 25 words. + +---- ALGORITHMS ---- + +>> B2: (3 marks) +>> Suppose threads A, B, and C have nice values 0, 1, and 2 and each has a +>> recent_cpu value of 0. +>> Fill in the table below showing the scheduling decision, the priority and the +>> recent_cpu values for each thread after each given number of timer ticks: + +timer recent_cpu priority thread +ticks A B C A B C to run +----- -- -- -- -- -- -- ------ + 0 + 4 + 8 +12 +16 +20 +24 +28 +32 +36 + +>> B3: (2 marks) +>> Did any ambiguities in the scheduler specification make values in the table +>> uncertain? +>> If so, what rule did you use to resolve them? + +---- RATIONALE ---- + +>> B4: (3 marks) +>> Briefly critique your design, pointing out advantages and disadvantages in +>> your design choices. diff --git a/doc/userprog.texi b/doc/userprog.texi new file mode 100644 index 0000000..26fd433 --- /dev/null +++ b/doc/userprog.texi @@ -0,0 +1,1241 @@ +@node Task 2--User Programs +@chapter Task 2: User Programs + +Now that you've worked with PintOS and are becoming familiar with its +infrastructure and thread package, it's time to start working on the +parts of the system that allow running user programs. +The base code already supports loading and +running user programs, but no I/O or interactivity +is possible. In this task, you will enable programs to interact with +the OS via system calls. + +You will be working out of the @file{userprog} directory for this +assignment, but you will also be interacting with almost every +other part of PintOS. We will describe the +relevant parts below. + +You can build task 2 on top of your task 1 submission or you can +start fresh. No code from task 1 is required for this +assignment. The ``alarm clock'' functionality from task 0 may be useful in +task 3, but it is not strictly required. + +You might find it useful to go back and reread how to run the tests +(@pxref{Testing}). + +@menu +* Task 2 Background:: +* Task 2 Suggested Order of Implementation:: +* Task 2 Requirements:: +* Task 2 FAQ:: +* 80x86 Calling Convention:: +@end menu + +@node Task 2 Background +@section Background + +Up to now, all of the code you have run under PintOS has been part +of the operating system kernel. This means, for example, that all the +test code from the last assignment ran as part of the kernel, with +full access to privileged parts of the system. Once we start running +user programs on top of the operating system, this is no longer true. +This task deals with the consequences. + +We allow more than one process to run at a time. Each process has one +thread (multithreaded processes are not supported). User programs are +written under the illusion that they have the entire machine. This +means that when you load and run multiple processes at a time, you must +manage memory, scheduling, and other state correctly to maintain this +illusion. + +In the previous task, we compiled our test code directly into your +kernel, so we had to require certain specific function interfaces within +the kernel. From now on, we will test your operating system by running +user programs. This gives you much greater freedom. You must make sure +that the user program interface meets the specifications described here, +but given that constraint you are free to restructure or rewrite kernel +code however you wish. + +@menu +* Task 2 Source Files:: +* Using the File System:: +* How User Programs Work:: +* Virtual Memory Layout:: +* Accessing User Memory:: +@end menu + +@node Task 2 Source Files +@subsection Source Files + +The easiest way to get an overview of the programming you will be +doing is to simply go over each part you'll be working with. In +@file{userprog}, you'll find a small number of files, but here is +where the bulk of your work will be: + +@table @file +@item process.c +@itemx process.h +Loads ELF binaries and starts processes. + +@item pagedir.c +@itemx pagedir.h +A simple manager for 80@var{x}86 hardware page tables. +Although you probably won't want to modify this code for this task, +you may want to call some of its functions. +@xref{Page Tables}, for more information. + +@item syscall.c +@itemx syscall.h +Whenever a user process wants to access some kernel functionality, it +invokes a system call. This is a skeleton system call +handler. Currently, it just prints a message and terminates the user +process. In part 2 of this task you will add code to do everything +else needed by system calls. + +@item exception.c +@itemx exception.h +When a user process performs a privileged or prohibited operation, it +traps into the kernel as an ``exception'' or ``fault.''@footnote{We +will treat these terms as synonyms. There is no standard +distinction between them, although Intel processor manuals make +a minor distinction between them on 80@var{x}86.} These files handle +exceptions. Currently all exceptions simply print a message and +terminate the process. Some, but not all, solutions to task 2 +require modifying @func{page_fault} in this file. + +@item gdt.c +@itemx gdt.h +The 80@var{x}86 is a segmented architecture. The Global Descriptor +Table (GDT) is a table that describes the segments in use. These +files set up the GDT. You should not need to modify these +files for any of the tasks. You can read the code if +you're interested in how the GDT works. + +@item tss.c +@itemx tss.h +The Task-State Segment (TSS) is used for 80@var{x}86 architectural +task switching. PintOS uses the TSS only for switching stacks when a +user process enters an interrupt handler, as does Linux. You +should not need to modify these files for any of the tasks. +You can read the code if you're interested in how the TSS +works. +@end table + +@node Using the File System +@subsection Using the File System + +You will need to interface to the file system code for this task, +because +user programs are loaded from the file system and many of the +system calls you must implement deal with the file system. However, +the focus of this task is not the file system, so we have +provided a simple but complete file system in the @file{filesys} +directory. You +will want to look over the @file{filesys.h} and @file{file.h} +interfaces to understand how to use the file system, and especially +its many limitations. + +There is no need to modify the file system code for this task, and so +we recommend that you do not. Working on the file system is likely to +distract you from this task's focus. + +You will have to tolerate the following limitations of the provided +filesystem implementation: + +@itemize @bullet +@item +No internal synchronization. Concurrent accesses will interfere with one +another. You should use synchronization to ensure that only one process at a +time is executing file system code. No finer-grained synchronisation +(for eg. per-file locking) is expected. + +@item +File size is fixed at creation time. The root directory is +represented as a file, so the number of files that may be created is also +limited. + +@item +File data is allocated as a single extent, that is, data in a single +file must occupy a contiguous range of sectors on disk. External +fragmentation can therefore become a serious problem as a file system is +used over time. + +@item +No subdirectories. + +@item +File names are limited to 14 characters. + +@item +A system crash mid-operation may corrupt the disk in a way +that cannot be repaired automatically. There is no file system repair +tool anyway. +@end itemize + +One important feature is included: + +@itemize @bullet +@item +Unix-like semantics for @func{filesys_remove} are implemented. +That is, if a file is open when it is removed, its blocks +are not deallocated and it may still be accessed by any +threads that have it open, until the last one closes it. @xref{Removing +an Open File}, for more information. +@end itemize + +You need to be able to create a simulated disk with a file system +partition. The @command{pintos-mkdisk} program provides this +functionality. From the @file{userprog/build} directory, execute +@code{pintos-mkdisk filesys.dsk --filesys-size=2}. This command +creates a simulated disk named @file{filesys.dsk} that contains a @w{2 +MB} PintOS file system partition. Then format the file system +partition by passing @option{-f -q} on the kernel's command line: +@code{pintos -f -q}. The @option{-f} option causes the file system to +be formatted, and @option{-q} causes PintOS to exit as soon as the +format is done. + +You'll need a way to copy files in and out of the simulated file system. +The @code{pintos} @option{-p} (``put'') and @option{-g} (``get'') +options do this. To copy @file{@var{file}} into the +PintOS file system, use the command @file{pintos -p @var{file} -- -q}. +(The @samp{--} is needed because @option{-p} is for the @command{pintos} +script, not for the simulated kernel.) To copy it to the PintOS file +system under the name @file{@var{newname}}, add @option{-a +@var{newname}}: @file{pintos -p @var{file} -a @var{newname} -- -q}. The +commands for copying files out of a VM are similar, but substitute +@option{-g} for @option{-p}. + +Incidentally, these commands work by passing special commands +@command{extract} and @command{append} on the kernel's command line and copying +to and from a special simulated ``scratch'' partition. If you're very +curious, you can look at the @command{pintos} script as well as +@file{filesys/fsutil.c} to learn the implementation details. + +Here's a summary of how to create a disk with a file system partition, +format the file system, copy the @command{echo} program into the new +disk, and then run @command{echo}, passing argument @code{x}. +(Argument passing won't work until you implemented it.) It assumes +that you've already built the examples in @file{examples} and that the +current directory is @file{userprog/build}: + +@example +pintos-mkdisk filesys.dsk --filesys-size=2 +pintos -f -q +pintos -p ../../examples/echo -a echo -- -q +pintos -q run 'echo x' +@end example + +The three final steps can actually be combined into a single command: + +@example +pintos-mkdisk filesys.dsk --filesys-size=2 +pintos -p ../../examples/echo -a echo -- -f -q run 'echo x' +@end example + +If you don't want to keep the file system disk around for later use or +inspection, you can even combine all four steps into a single command. +The @code{--filesys-size=@var{n}} option creates a temporary file +system partition +approximately @var{n} megabytes in size just for the duration of the +@command{pintos} run. The PintOS automatic test suite makes extensive +use of this syntax: + +@example +pintos --filesys-size=2 -p ../../examples/echo -a echo -- -f -q run 'echo x' +@end example + +You can delete a file from the PintOS file system using the @code{rm +@var{file}} kernel action, e.g.@: @code{pintos -q rm @var{file}}. Also, +@command{ls} lists the files in the file system and @code{cat +@var{file}} prints a file's contents to the display. + +@node How User Programs Work +@subsection How User Programs Work + +PintOS can run normal C programs, as long as they fit into memory and use +only the system calls you implement. Notably, @func{malloc} cannot be +implemented because none of the system calls required for this task +allow for memory allocation. PintOS also can't run programs that use +floating point operations, since the kernel doesn't save and restore the +processor's floating-point unit when switching threads. + +The @file{src/examples} directory contains a few sample user +programs. The @file{Makefile} in this directory +compiles the provided examples, and you can edit it +compile your own programs as well. Some of the example programs will +only work once task 3 has been implemented. + +PintOS can load @dfn{ELF} executables with the loader provided for you +in @file{userprog/process.c}. ELF is a file format used by Linux, +Solaris, and many other operating systems for object files, +shared libraries, and executables. You can actually use any compiler +and linker that output 80@var{x}86 ELF executables to produce programs +for PintOS. (We've provided compilers and linkers that should do just +fine.) + +You should realize immediately that, until you copy a +test program to the simulated file system, PintOS will be unable to do +useful work. You won't be able to do +interesting things until you copy a variety of programs to the file system. +You might want to create a clean reference file system disk and copy that +over whenever you trash your @file{filesys.dsk} beyond a useful state, +which may happen occasionally while debugging. + +@node Virtual Memory Layout +@subsection Virtual Memory Layout + +Virtual memory in PintOS is divided into two regions: user virtual +memory and kernel virtual memory. User virtual memory ranges from +virtual address 0 up to @code{PHYS_BASE}, which is defined in +@file{threads/vaddr.h} and defaults to @t{0xc0000000} (3 GB). Kernel +virtual memory occupies the rest of the virtual address space, from +@code{PHYS_BASE} up to 4 GB. + +User virtual memory is per-process. +When the kernel switches from one process to another, it +also switches user virtual address spaces by changing the processor's +page directory base register (see @func{pagedir_activate} in +@file{userprog/pagedir.c}). @struct{thread} contains a pointer to a +process's page table. + +Kernel virtual memory is global. It is always mapped the same way, +regardless of what user process or kernel thread is running. In +PintOS, kernel virtual memory is mapped one-to-one to physical +memory, starting at @code{PHYS_BASE}. That is, virtual address +@code{PHYS_BASE} accesses physical +address 0, virtual address @code{PHYS_BASE} + @t{0x1234} accesses +physical address @t{0x1234}, and so on up to the size of the machine's +physical memory. + +A user program can only access its own user virtual memory. An attempt to +access kernel virtual memory causes a page fault, handled by +@func{page_fault} in @file{userprog/exception.c}, and the process +will be terminated. Kernel threads can access both kernel virtual +memory and, if a user process is running, the user virtual memory of +the running process. However, even in the kernel, an attempt to +access memory at an unmapped user virtual address +will cause a page fault. + +@page +@menu +* Typical Memory Layout:: +@end menu + +@node Typical Memory Layout +@subsubsection Typical Memory Layout + +Conceptually, each process is +free to lay out its own user virtual memory however it +chooses. In practice, user virtual memory is laid out like this: + +@html +
    +@end html +@example +@group + PHYS_BASE +----------------------------------+ + | user stack | + | | | + | | | + | V | + | grows downward | + | | + | | + | | + | | + | grows upward | + | ^ | + | | | + | | | + +----------------------------------+ + | uninitialized data segment (BSS) | + +----------------------------------+ + | initialized data segment | + +----------------------------------+ + | code segment | + 0x08048000 +----------------------------------+ + | | + | | + | | + | | + | | + 0 +----------------------------------+ +@end group +@end example +@html +
    +@end html + +In this task, the user stack is fixed in size, but in task 3 it +will be allowed to grow. Traditionally, the size of the uninitialized +data segment can be adjusted with a system call, but you will not have +to implement this. + +The code segment in PintOS starts at user virtual address +@t{0x08084000}, approximately 128 MB from the bottom of the address +space. This value is specified in @bibref{SysV-i386} and has no deep +significance. + +The linker sets the layout of a user program in memory, as directed by a +``linker script'' that tells it the names and locations of the various +program segments. You can learn more about linker scripts by reading +the ``Scripts'' chapter in the linker manual, accessible via @samp{info +ld}. + +To view the layout of a particular executable, run @command{objdump} +(80@var{x}86) with the @option{-p} +option. + +@node Accessing User Memory +@subsection Accessing User Memory + +As part of a system +call, the kernel must often access memory through pointers provided by a user +program. The kernel must be very careful about doing so, because +the user can pass a null pointer, a pointer to +unmapped virtual memory, or a pointer to kernel virtual address space +(above @code{PHYS_BASE}). All of these types of invalid pointers must +be rejected without harm to the kernel or other running processes, by +terminating the offending process and freeing its resources. + +There are at least two reasonable ways to do this correctly. The +first method is to verify +the validity of a user-provided pointer, then dereference it. If you +choose this route, you'll want to look at the functions in +@file{userprog/pagedir.c} and in @file{threads/vaddr.h}, specifically +@func{pagedir_get_page} and @func{is_user_vaddr}. This is the +simplest way to handle user memory access. + +The second method is to check only that a user +pointer points below @code{PHYS_BASE}, then dereference it. +An invalid user pointer will cause a ``page fault'' that you can +handle by modifying the code for @func{page_fault} in +@file{userprog/exception.c}. This technique is normally faster +because it takes advantage of the processor's MMU, so it tends to be +used in real kernels (including Linux). + +In either case, you need to make sure not to ``leak'' resources. For +example, suppose that your system call has acquired a lock or +allocated memory with @func{malloc}. If you encounter an invalid user pointer +afterward, you must still be sure to release the lock or free the page +of memory. If you choose to verify user pointers before dereferencing +them, this should be straightforward. It's more difficult to handle +if an invalid pointer causes a page fault, +because there's no way to return an error code from a memory access. +Therefore, for those who want to try the latter technique, we'll +provide a little bit of helpful code: + +@verbatim +/* Reads a byte at user virtual address UADDR. + UADDR must be below PHYS_BASE. + Returns the byte value if successful, -1 if a segfault + occurred. */ +static int +get_user (const uint8_t *uaddr) +{ + int result; + asm ("movl $1f, %0; movzbl %1, %0; 1:" + : "=&a" (result) : "m" (*uaddr)); + return result; +} + +/* Writes BYTE to user address UDST. + UDST must be below PHYS_BASE. + Returns true if successful, false if a segfault occurred. */ +static bool +put_user (uint8_t *udst, uint8_t byte) +{ + int error_code; + asm ("movl $1f, %0; movb %b2, %1; 1:" + : "=&a" (error_code), "=m" (*udst) : "q" (byte)); + return error_code != -1; +} +@end verbatim + +Each of these functions assumes that the user address has already been +verified to be below @code{PHYS_BASE}. They also assume that you've +modified @func{page_fault} so that a page fault in the kernel merely +sets the interupt frame @code{eax} to @t{0xffffffff} and copies the old value +into @code{eip}. + +@page +@node Task 2 Suggested Order of Implementation +@section Suggested Order of Implementation + +We suggest first implementing the following, which can happen in parallel: + +@itemize +@item +Argument passing (@pxref{Argument Passing}).@* +Every user program will page fault immediately until argument passing is implemented. + +For now, you may simply wish to change +@example +*esp = PHYS_BASE; +@end example +@noindent to +@example +*esp = PHYS_BASE - 12; +@end example +in @func{setup_stack} to fake the set-up for a minimaml stack. + +This will work for any example program that doesn't examine its arguments (e.g. @code{halt.c}), +although the program's name will be printed as @code{(null)}. + +Note that all of the Task 2 tests access the program arguments, so these will still page-fault and die. +Thus, you will still fail all of the Task 2 tests at this point. + +Until you implement argument passing fully, you should only run programs without passing command-line arguments. +Currently, attempting to pass @strong{any} arguments to a program will cause the kernel to search for a program whose +name includes those arguments. This will obviously fail and cause the kernel to abort running the program. + +@item +User memory access (@pxref{Accessing User Memory}). All system calls +need to read user memory. Few system calls need to write to user +memory. + +@item +System call infrastructure (@pxref{System Calls}). Implement enough +code to read the system call number from the user stack and dispatch to +a handler based on it. + +@item +The @code{exit} system call. Every user program that finishes in the +normal way calls @code{exit}. Even a program that returns from +@func{main} calls @code{exit} indirectly (see @func{_start} in +@file{lib/user/entry.c}). + +@item +The @code{write} system call for writing to fd 1, the system console. +All of our test programs write to the console (the user process version +of @func{printf} is implemented this way), so they will all malfunction +until @code{write} is available. + +@item +For now, change @func{process_wait} to an infinite loop (one that waits +forever). The purpose of @func{process_wait} is described in more detail +above it's function stub in @file{src/userprog/process.c}, and more +information can be found in the description of the @code{wait} system call +later in this document. +The provided implementation returns immediately, so PintOS +will power off before any processes actually get to run. You will +eventually need to provide a correct implementation. +@end itemize + +After the above are implemented, user processes should work minimally, +although you will still fail all of the Task 2 tests +(as these all print the program name @code{argv[0]} in their output). +However, you should at least be able to write to the console and exit correctly. +You can then refine your implementation so that some of the tests start +to pass (your first step should be to complete @func{process_wait} so +that user programs return correctly). In order to minimise the amount of +time you spend on this exercise, it is vital that you implement the +@code{write}, @code{exit} and @code{wait} system calls before beginning the +others. + +@node Task 2 Requirements +@section Requirements + +@menu +* Task 2 Design Document:: +* Process Termination Messages:: +* Argument Passing:: +* System Calls:: +* Denying Writes to Executables:: +@end menu + +@node Task 2 Design Document +@subsection Design Document + +When you submit your work for task 2, you must also submit a completed copy of +@uref{userprog.tmpl, , the task 2 design document template}. +You can find a template design document for this task in @file{pintos/doc/userprog.tmpl} and also on CATe. +You are free to submit your design document as either a @file{.txt} or @file{.pdf} file. +We recommend that you read the design document template before you start working on the task. +@xref{Task Documentation}, for a sample design document that goes along with a fictitious task. + +@node Process Termination Messages +@subsection Process Termination Messages + +Whenever a user process terminates, because it called @code{exit} +or for any other reason, print the process's name +and exit code, formatted as if printed by @code{printf ("%s: +exit(%d)\n", @dots{});}. The name printed should be the full name +passed to @func{process_execute}, omitting command-line arguments. +Do not print these messages when a kernel thread that is not a user +process terminates, or +when the @code{halt} system call is invoked. The message is optional +when a process fails to load. + +Aside from this, don't print any other +messages that PintOS as provided doesn't already print. You may find +extra messages useful during debugging, but they will confuse the +grading scripts and thus lower your score. + +@node Argument Passing +@subsection Argument Passing + +Currently, @func{process_execute}, found in @file{src/userprog/process.c}, does not support passing arguments to new processes. +Instead, the entire command line will be treated as the program name, resulting in the kernel failing to load the correct program file into memory. +You will need to fix this. + +Implement argument passing by extending @func{process_execute} so that rather than simply taking a program file name to be the whole command line, +it instead divides the command line into words at spaces. +The first word is the program name, the second word is the first argument, and so on. +That is, @code{process_execute("grep foo bar")} should run @command{grep} passing two arguments @code{foo} and @code{bar}. + +Within a command line, multiple spaces are equivalent to a single space, +so that @code{process_execute("grep @w{ }foo @w{ }@w{ }bar")} is equivalent to our original example. +You can impose a reasonable limit on the length of the command line arguments. +For example, you could limit the arguments to those that will fit in a single page (4 kB). +(There is an @strong{unrelated} limit of 128 bytes on command-line arguments that the @command{pintos} utility can pass to the kernel.) + +You can parse argument strings any way you like. +If you're lost, look at @func{strtok_r}, prototyped in @file{lib/string.h} and implemented with thorough comments in @file{lib/string.c}. +You can find more about it by looking at the man page (run @code{man strtok_r} at the prompt). + +Virtually all the code you will write relating to argument passing will be in @func{process_execute} and @func{start_process}. +@func{process_execute} creates a new thread, calling @func{start_process} to load the actual process into the thread and set up the stack and other related structures. +You must ensure that the correct executable file is loaded within @func{start_process}. + +@xref{Program Startup Details}, for information on exactly how you +need to set up the stack. + +@node System Calls +@subsection System Calls + +Implement the system call handler in @file{userprog/syscall.c}. The +skeleton implementation we provide ``handles'' system calls by +terminating the process. It will need to retrieve the system call +number, then any system call arguments, and carry out appropriate actions. + +Implement the following system calls. The prototypes listed are those +seen by a user program that includes @file{lib/user/syscall.h}. (This +header, and all others in @file{lib/user}, are for use by user +programs only.) System call numbers for each system call are defined in +@file{lib/syscall-nr.h}: + +@deftypefn {System Call} void halt (void) +Terminates PintOS by calling @func{shutdown_power_off} (declared in +@file{devices/shutdown.h}). This should be seldom used, because you lose +some information about possible deadlock situations, etc. +@var{*Warning*: The original PintOS documentation on the Stanford website +is outdated and incorrectly places the shutdown function in the wrong +location. It's advisable that you don't use it as a reference +in completing any of the tasks.} +@end deftypefn + +@deftypefn {System Call} void exit (int @var{status}) +Terminates the current user program, sending its exit @var{status} to the +kernel. If the process's parent @code{wait}s for it (see below), this +is the status +that will be returned. Conventionally, a @var{status} of 0 indicates +success and nonzero values indicate errors. +@end deftypefn + +@deftypefn {System Call} pid_t exec (const char *@var{cmd_line}) +Runs the executable whose name is given in @var{cmd_line}, passing any +given arguments, and returns the new process's program id (pid). Must +return pid -1, which otherwise should not be a valid pid, if +the program cannot load or run for any reason. +Thus, the parent process cannot return from the @code{exec} until it +knows whether the child process successfully loaded its executable. +You must use appropriate synchronization to ensure this. +@end deftypefn + +@deftypefn {System Call} int wait (pid_t @var{pid}) +Waits for a child process @var{pid} and retrieves the child's exit status. + +If @var{pid} is still alive, waits until it terminates. +Then, returns the status that @var{pid} passed to @code{exit}. +If @var{pid} did not call @code{exit()}, but was terminated by the kernel (e.g.@: killed due to an exception), +@code{wait(pid)} must return -1. +It is perfectly legal for a parent process to wait for child processes that have already terminated by the time the parent calls @code{wait}, +but the kernel must still allow the parent to retrieve its child's exit status, or learn that the child was terminated by the kernel. + +@code{wait} must fail and return -1 immediately if any of the following conditions are true: +@itemize @bullet +@item +@var{pid} does not refer to a direct child of the calling process. +@var{pid} is a direct child of the calling process if and only if the calling process received @var{pid} +as a return value from a successful call to @code{exec}. + +Note that children are not inherited: +if @var{A} spawns child @var{B} and @var{B} spawns child process @var{C}, then @var{A} cannot wait for @var{C}, even if @var{B} is dead. +A call to @code{wait(C)} by process @var{A} must fail. +Similarly, orphaned processes are not assigned to a new parent if their parent process exits before they do. + +@item +The process that calls @code{wait} has already called @code{wait} on @var{pid}. +That is, a process may wait for any given child at most once. +@end itemize + +Processes may spawn any number of children, wait for them in any order, +and may even exit without having waited for some or all of their children. +Your design should consider all the ways in which waits can occur. +All of a process's resources, including its @struct{thread}, must be freed whether its parent ever waits for it or not, +and regardless of whether the child exits before or after its parent. + +As a special case, you must ensure that PintOS does not terminate until the initial process exits. +The supplied PintOS code tries to do this by calling @func{process_wait} (in @file{userprog/process.c}) +from @func{main} (in @file{threads/init.c}). + +We strongly suggest that you implement @func{process_wait} according to the comment at the top of the function +and then implement the @code{wait} system call in terms of @func{process_wait}. + +Be aware that implementing this system call requires considerably more work than any of the others. +@end deftypefn + +@deftypefn {System Call} bool create (const char *@var{file}, unsigned @var{initial_size}) +Creates a new file called @var{file} initially @var{initial_size} bytes +in size. Returns true if successful, false otherwise. +Creating a new file does not open it: opening the new file is a +separate operation which would require a @code{open} system call. +@end deftypefn + +@deftypefn {System Call} bool remove (const char *@var{file}) +Deletes the file called @var{file}. Returns true if successful, false +otherwise. +A file may be removed regardless of whether it is open or closed, and +removing an open file does not close it. @xref{Removing an Open +File}, for details. +@end deftypefn + +@deftypefn {System Call} int open (const char *@var{file}) +Opens the file called @var{file}. Returns a nonnegative integer handle +called a ``file descriptor'' (fd), or -1 if the file could not be +opened. + +File descriptors numbered 0 and 1 are reserved for the console: fd 0 +(@code{STDIN_FILENO}) is standard input, fd 1 (@code{STDOUT_FILENO}) is +standard output. The @code{open} system call will never return either +of these file descriptors, which are valid as system call arguments only +as explicitly described below. + +Each process has an independent set of file descriptors. File +descriptors are not inherited by child processes. + +When a single file is opened more than once, whether by a single +process or different processes, each @code{open} returns a new file +descriptor. Different file descriptors for a single file are closed +independently in separate calls to @code{close} and they do not share +a file position. +@end deftypefn + +@deftypefn {System Call} int filesize (int @var{fd}) +Returns the size, in bytes, of the file open as @var{fd}. +@end deftypefn + +@deftypefn {System Call} int read (int @var{fd}, void *@var{buffer}, unsigned @var{size}) +Reads @var{size} bytes from the file open as @var{fd} into +@var{buffer}. Returns the number of bytes actually read (0 at end of +file), or -1 if the file could not be read (due to a condition other +than end of file). Fd 0 reads from the keyboard using +@func{input_getc}, which can be found in @file{src/devices/input.h}. +@end deftypefn + +@deftypefn {System Call} int write (int @var{fd}, const void *@var{buffer}, unsigned @var{size}) +Writes @var{size} bytes from @var{buffer} to the open file @var{fd}. +Returns the number of bytes actually written, which may be less than +@var{size} if some bytes could not be written. + +Writing past end-of-file would normally extend the file, but file growth +is not implemented by the basic file system. The expected behaviour is +to write as many bytes as possible up to end-of-file and return the +actual number written, or 0 if no bytes could be written at all. + +Fd 1 writes to the console. Your code to write to the console should +write all of @var{buffer} in one call to @func{putbuf}, at least as +long as @var{size} is not bigger than a few hundred bytes. (It is +reasonable to break up larger buffers.) Otherwise, +lines of text output by different processes may end up interleaved on +the console, confusing both human readers and our grading scripts. +@end deftypefn + +@deftypefn {System Call} void seek (int @var{fd}, unsigned @var{position}) +Changes the next byte to be read or written in open file @var{fd} to +@var{position}, expressed in bytes from the beginning of the file. +(Thus, a @var{position} of 0 is the file's start.) + +A seek past the current end of a file is not an error. +A later read obtains 0 bytes, indicating end of file. +Normally, a later write would extend the file, filling any unwritten gap with zeros. +However, in PintOS files have a fixed length, so writes past end of file will return an error. +These semantics are implemented in the file system and do not require any special effort in system call implementation. +@end deftypefn + +@deftypefn {System Call} unsigned tell (int @var{fd}) +Returns the position of the next byte to be read or written in open +file @var{fd}, expressed in bytes from the beginning of the file. +@end deftypefn + +@deftypefn {System Call} void close (int @var{fd}) +Closes file descriptor @var{fd}. +Exiting or terminating a process implicitly closes all its open file +descriptors, as if by calling this function for each one. +@end deftypefn + +The system call handler defines other syscalls. Ignore them for now. You will +implement the rest in task 3, so be +sure to design your system with extensibility in mind. + +To implement syscalls, you need to provide ways to read and write data +in user virtual address space. +You need this ability before you can +even obtain the system call number, because the system call number is +on the user's stack in the user's virtual address space. +This can be a bit tricky: what if the user provides an invalid +pointer, a pointer into kernel memory, or a block +partially in one of those regions? You should handle these cases by +terminating the user process. We recommend +writing and testing this code before implementing any other system +call functionality. @xref{Accessing User Memory}, for more information. + +You must synchronize system calls so that +any number of user processes can make them at once. In particular, it +is not safe to call into the file system code provided in the +@file{filesys} directory from multiple threads at once. Your system +call implementation must treat the file system code as a critical +section. Don't forget +that @func{process_execute} also accesses files. For now, we +recommend against modifying code in the @file{filesys} directory. + +We have provided you a user-level function for each system call in +@file{lib/user/syscall.c}. These provide a way for user processes to +invoke each system call from a C program. Each uses a little inline +assembly code to invoke the system call and (if appropriate) returns the +system call's return value. + +When you're done with this part, and forevermore, PintOS should be +bulletproof. Nothing that a user program can do should ever cause the +OS to crash, panic, fail an assertion, or otherwise malfunction. It is +important to emphasize this point: our tests will try to break your +system calls in many, many ways. You need to think of all the corner +cases and handle them. The sole way a user program should be able to +cause the OS to halt is by invoking the @code{halt} system call. + +If a system call is passed an invalid argument, acceptable options +include returning an error value (for those calls that return a +value), returning an undefined value, or terminating the process. + +@xref{System Call Details}, for details on how system calls work. + +@node Denying Writes to Executables +@subsection Denying Writes to Executables + +Add code to deny writes to files in use as executables. Many OSes do +this because of the unpredictable results if a process tried to run code +that was in the midst of being changed on disk. This is especially +important once virtual memory is implemented in task 3, but it can't +hurt even now. + +You can use @func{file_deny_write} to prevent writes to an open file. +Calling @func{file_allow_write} on the file will re-enable them (unless +the file is denied writes by another opener). Closing a file will also +re-enable writes. Thus, to deny writes to a process's executable, you +must keep it open as long as the process is still running. + +@node Task 2 FAQ +@section FAQ + +@table @b +@item How much code will I need to write? + +Here's a summary of our reference solution, produced by the +@command{diffstat} program. The final row gives total lines inserted +and deleted; a changed line counts as both an insertion and a deletion. + +@verbatim + threads/thread.c | 13 + threads/thread.h | 26 + + userprog/exception.c | 8 + userprog/process.c | 247 ++++++++++++++-- + userprog/syscall.c | 468 ++++++++++++++++++++++++++++++- + userprog/syscall.h | 1 + 6 files changed, 725 insertions(+), 38 deletions(-) +@end verbatim + +The reference solution represents just one possible solution. Many +other solutions are also possible and many of those differ greatly from +the reference solution. Some excellent solutions may not modify all the +files modified by the reference solution, and some may modify files not +modified by the reference solution. + +@item Do we need a working Task 1 to implement Task 2? + +No. + +@item The kernel always panics when I run @code{pintos -p @var{file} -- -q}. + +Did you format the file system (with @samp{pintos -f})? + +Is your file name too long? The file system limits file names to 14 +characters. A command like @samp{pintos -p ../../examples/echo -- -q} +will exceed the limit. Use @samp{pintos -p ../../examples/echo -a echo +-- -q} to put the file under the name @file{echo} instead. + +Is the file system full? + +Does the file system already contain 16 files? The base PintOS file +system has a 16-file limit. + +The file system may be so fragmented that there's not enough contiguous +space for your file. + +@item When I run @code{pintos -p ../file --}, @file{file} isn't copied. + +Files are written under the name you refer to them, by default, so in +this case the file copied in would be named @file{../file}. You +probably want to run @code{pintos -p ../file -a file --} instead. + +You can list the files in your file system with @code{pintos -q ls}. + +@item All my user programs die with page faults. + +This will happen if you haven't implemented argument passing +(or haven't done so correctly). The basic C library for user programs tries +to read @var{argc} and @var{argv} off the stack. If the stack +isn't properly set up, this causes a page fault. + +@item All my user programs die with @code{system call!} + +You'll have to implement system calls before you see anything else. +Every reasonable program tries to make at least one system call +(@func{exit}) and most programs make more than that. Notably, +@func{printf} invokes the @code{write} system call. The default system +call handler just prints @samp{system call!} and terminates the program. +Until then, you can use @func{hex_dump} to convince yourself that +argument passing is implemented correctly (@pxref{Program Startup Details}). + +@item How can I disassemble user programs? + +The @command{objdump} (80@var{x}86) utility can disassemble entire user +programs or object files. Invoke it as @code{objdump -d +@var{file}}. You can use GDB's +@code{disassemble} command to disassemble individual functions +(@pxref{GDB}). + +@item Why do many C include files not work in PintOS programs? +@itemx Can I use lib@var{foo} in my PintOS programs? + +The C library we provide is very limited. It does not include many of +the features that are expected of a real operating system's C library. +The C library must be built specifically for the operating system (and +architecture), since it must make system calls for I/O and memory +allocation. (Not all functions do, of course, but usually the library +is compiled as a unit.) + +The chances are good that the library you want uses parts of the C library +that PintOS doesn't implement. It will probably take at least some +porting effort to make it work under PintOS. Notably, the PintOS +user program C library does not have a @func{malloc} implementation. + +@item How do I compile new user programs? + +Modify @file{src/examples/Makefile}, then run @command{make}. + +@item Can I run user programs under a debugger? + +Yes, with some limitations. @xref{GDB}. + +@item What's the difference between @code{tid_t} and @code{pid_t}? + +A @code{tid_t} identifies a kernel thread, which may have a user +process running in it (if created with @func{process_execute}) or not +(if created with @func{thread_create}). It is a data type used only +in the kernel. + +A @code{pid_t} identifies a user process. It is used by user +processes and the kernel in the @code{exec} and @code{wait} system +calls. + +You can choose whatever suitable types you like for @code{tid_t} and +@code{pid_t}. By default, they're both @code{int}. You can make them +a one-to-one mapping, so that the same values in both identify the +same process, or you can use a more complex mapping. It's up to you. + +@item What should I expect from the Task 2 code-review? + +The code-review for this task will be conducted with each group in-person. +Our Task 2 code-review will cover @strong{four} main areas: +functional correctness, efficiency, design quality and general coding style. + +@itemize @bullet +@item For @strong{functional correctness}, we will be looking to see if your argument passing code can avoid stack-overflow for all possible input command lines. +We will also be checking if your data structures for storing file descriptors, your file-system accesses and your implementation of the @func{wait} and @func{exit} system calls are all free of any race conditions. + +@item For @strong{efficiency}, we will be looking at how you are storing the process parent/child relationships, how you are storing child load status and ensuring that your code does not leak memory in any situation. + +@item For @strong{design quality}, we will be looking at how you have abstracted your argument passing code from the underlying stack updates (pushing arguments and their pointers onto the stack) and your system call handler to avoid repetitive code for each syscall case. +We will also be looking at the level of fidelity in your use of synchronisation for the @func{exec}, @func{wait} and @func{exit} system calls. + +@item For @strong{general coding style}, we will be paying attention to all of the usual elements of good style +that you should be used to from last year (e.g. consistent code layout, appropriate use of comments, avoiding magic numbers, etc.) +as well as your use of git (e.g. commit frequency and commit message quality). +In this task, we will be paying particular attention to magic numbers in your system call handler, as well as your use of global variables anywhere in your solution. +@end itemize +@end table + +@menu +* Argument Passing FAQ:: +* System Calls FAQ:: +@end menu + +@node Argument Passing FAQ +@subsection Argument Passing FAQ + +@table @b +@item Isn't the top of stack in kernel virtual memory? + +The top of stack is at @code{PHYS_BASE}, typically @t{0xc0000000}, which +is also where kernel virtual memory starts. +But before the processor pushes data on the stack, it decrements the stack +pointer. Thus, the first (4-byte) value pushed on the stack +will be at address @t{0xbffffffc}. + +@item Is @code{PHYS_BASE} fixed? + +No. You should be able to support @code{PHYS_BASE} values that are +any multiple of @t{0x10000000} from @t{0x80000000} to @t{0xf0000000}, +simply via recompilation. +@end table + +@node System Calls FAQ +@subsection System Calls FAQ + +@table @b +@item Can I just cast a @code{struct file *} to get a file descriptor? +@itemx Can I just cast a @code{struct thread *} to a @code{pid_t}? + +You will have to make these design decisions yourself. +Most operating systems do distinguish between file +descriptors (or pids) and the addresses of their kernel data +structures. You might want to give some thought as to why they do so +before committing yourself. + +@item Can I set a maximum number of open files per process? + +It is better not to set an arbitrary limit. You may impose a limit of +128 open files per process, if necessary. + +@item What happens when an open file is removed? +@anchor{Removing an Open File} + +You should implement the standard Unix semantics for files. That is, when +a file is removed any process which has a file descriptor for that file +may continue to use that descriptor. This means that +they can read and write from the file. The file will not have a name, +and no other processes will be able to open it, but it will continue +to exist until all file descriptors referring to the file are closed +or the machine shuts down. + +@item How can I run user programs that need more than 4 kB stack space? + +You may modify the stack setup code to allocate more than one page of +stack space for each process. In the next task, you will implement a +better solution. + +@item What should happen if an @code{exec} fails midway through loading? + +@code{exec} should return -1 if the child process fails to load for +any reason. This includes the case where the load fails part of the +way through the process (e.g.@: where it runs out of memory in the +@code{multi-oom} test). Therefore, the parent process cannot return +from the @code{exec} system call until it is established whether the +load was successful or not. The child must communicate this +information to its parent using appropriate synchronization, such as a +semaphore (@pxref{Semaphores}), to ensure that the information is +communicated without race conditions. +@end table + +@node 80x86 Calling Convention +@section 80@var{x}86 Calling Convention + +This section summarizes important points of the convention used for +normal function calls on 32-bit 80@var{x}86 implementations of Unix. +Some details are omitted for brevity. If you do want all the details, +refer to @bibref{SysV-i386}. + +The calling convention works like this: + +@enumerate 1 +@item +The caller pushes each of the function's arguments on the stack one by +one, normally using the @code{PUSH} assembly language instruction. +Arguments are pushed in right-to-left order. + +The stack grows downward: each push decrements the stack pointer, then +stores into the location it now points to, like the C expression +@samp{*--sp = @var{value}}. + +@item +The caller pushes the address of its next instruction (the @dfn{return +address}) on the stack and jumps to the first instruction of the callee. +A single 80@var{x}86 instruction, @code{CALL}, does both. + +@item +The callee executes. When it takes control, the stack pointer points to +the return address, the first argument is just above it, the second +argument is just above the first argument, and so on. + +@item +If the callee has a return value, it stores it into register @code{EAX}. + +@item +The callee returns by popping the return address from the stack and +jumping to the location it specifies, using the 80@var{x}86 @code{RET} +instruction. + +@item +The caller pops the arguments off the stack. +@end enumerate + +Consider a function @func{f} that takes three @code{int} arguments. +This diagram shows a sample stack frame as seen by the callee at the +beginning of step 3 above, supposing that @func{f} is invoked as +@code{f(1, 2, 3)}. The initial stack address is arbitrary: + +@html +
    +@end html +@example + +----------------+ + 0xbffffe7c | 3 | + 0xbffffe78 | 2 | + 0xbffffe74 | 1 | +stack pointer --> 0xbffffe70 | return address | + +----------------+ +@end example +@html +
    +@end html + +@menu +* Program Startup Details:: +* System Call Details:: +@end menu + +@node Program Startup Details +@subsection Program Startup Details + +The PintOS C library for user programs designates @func{_start}, in +@file{lib/user/entry.c}, as the entry point for user programs. This +function is a wrapper around @func{main} that calls @func{exit} if +@func{main} returns: + +@example +void +_start (int argc, char *argv[]) +@{ + exit (main (argc, argv)); +@} +@end example + +The kernel must put the arguments for the initial function on the stack +before it allows the user program to begin executing. The arguments are +passed in the same way as the normal calling convention (@pxref{80x86 +Calling Convention}). + +Consider how to handle arguments for the following example command: +@samp{/bin/ls -l foo bar}. +First, break the command into words: @samp{/bin/ls}, +@samp{-l}, @samp{foo}, @samp{bar}. Place the words at the top of the +stack. Order doesn't matter, because they will be referenced through +pointers. + +Then, push the address of each string plus a null pointer sentinel, on +the stack, in right-to-left order. These are the elements of +@code{argv}. The null pointer sentinel ensures that @code{argv[argc]} +is a null pointer, as required by the C standard. The order ensures +that @code{argv[0]} is at the lowest virtual address. Word-aligned +accesses are faster than unaligned accesses, so for best performance +round the stack pointer down to a multiple of 4 before the first push. + +Then, push @code{argv} (the address of @code{argv[0]}) and @code{argc}, +in that order. Finally, push a fake ``return address'': although the +entry function will never return, its stack frame must have the same +structure as any other. + +The table below shows the state of the stack and the relevant registers +right before the beginning of the user program, assuming +@code{PHYS_BASE} is @t{0xc0000000}: + +@html +
    +@end html +@multitable {@t{0xbfffffff}} {return address} {@t{/bin/ls\0}} {@code{void (*) ()}} +@item Address @tab Name @tab Data @tab Type +@item @t{0xbffffffc} @tab @code{argv[3][@dots{}]} @tab @samp{bar\0} @tab @code{char[4]} +@item @t{0xbffffff8} @tab @code{argv[2][@dots{}]} @tab @samp{foo\0} @tab @code{char[4]} +@item @t{0xbffffff5} @tab @code{argv[1][@dots{}]} @tab @samp{-l\0} @tab @code{char[3]} +@item @t{0xbfffffed} @tab @code{argv[0][@dots{}]} @tab @samp{/bin/ls\0} @tab @code{char[8]} +@item @t{0xbfffffec} @tab word-align @tab 0 @tab @code{uint8_t} +@item @t{0xbfffffe8} @tab @code{argv[4]} @tab @t{0} @tab @code{char *} +@item @t{0xbfffffe4} @tab @code{argv[3]} @tab @t{0xbffffffc} @tab @code{char *} +@item @t{0xbfffffe0} @tab @code{argv[2]} @tab @t{0xbffffff8} @tab @code{char *} +@item @t{0xbfffffdc} @tab @code{argv[1]} @tab @t{0xbffffff5} @tab @code{char *} +@item @t{0xbfffffd8} @tab @code{argv[0]} @tab @t{0xbfffffed} @tab @code{char *} +@item @t{0xbfffffd4} @tab @code{argv} @tab @t{0xbfffffd8} @tab @code{char **} +@item @t{0xbfffffd0} @tab @code{argc} @tab 4 @tab @code{int} +@item @t{0xbfffffcc} @tab return address @tab 0 @tab @code{void (*) ()} +@end multitable +@html +
    +@end html + +In this example, the stack pointer would be initialized to +@t{0xbfffffcc}. + +As shown above, your code should start the stack at the very top of +the user virtual address space, in the page just below virtual address +@code{PHYS_BASE} (defined in @file{threads/vaddr.h}). + +You may find the non-standard @func{hex_dump} function, declared in +@file{}, useful for debugging your argument passing code. +Here's what it would show in the above example: + +@verbatim +bfffffc0 00 00 00 00 | ....| +bfffffd0 04 00 00 00 d8 ff ff bf-ed ff ff bf f5 ff ff bf |................| +bfffffe0 f8 ff ff bf fc ff ff bf-00 00 00 00 00 2f 62 69 |............./bi| +bffffff0 6e 2f 6c 73 00 2d 6c 00-66 6f 6f 00 62 61 72 00 |n/ls.-l.foo.bar.| +@end verbatim + +@node System Call Details +@subsection System Call Details + +The first task already dealt with one way that the operating system +can regain control from a user program: interrupts from timers and I/O +devices. These are ``external'' interrupts, because they are caused +by entities outside the CPU (@pxref{External Interrupt Handling}). + +The operating system also deals with software exceptions, which are +events that occur in program code (@pxref{Internal Interrupt +Handling}). These can be errors such as a page fault or division by +zero. Exceptions are also the means by which a user program +can request services (``system calls'') from the operating system. + +In the 80@var{x}86 architecture, the @samp{int} instruction is the +most commonly used means for invoking system calls. This instruction +is handled in the same way as other software exceptions. In PintOS, +user programs invoke @samp{int $0x30} to make a system call. The +system call number and any additional arguments are expected to be +pushed on the stack in the normal fashion before invoking the +interrupt (@pxref{80x86 Calling Convention}). + +Thus, when the system call handler @func{syscall_handler} gets control, +the system call number is in the 32-bit word at the caller's stack +pointer, the first argument is in the 32-bit word at the next higher +address, and so on. The caller's stack pointer is accessible to +@func{syscall_handler} as the @samp{esp} member of the +@struct{intr_frame} passed to it. (@struct{intr_frame} is on the kernel +stack.) + +The 80@var{x}86 convention for function return values is to place them +in the @code{EAX} register. System calls that return a value can do +so by modifying the @samp{eax} member of @struct{intr_frame}. + +You should try to avoid writing large amounts of repetitive code for +implementing system calls. Each system call argument, whether an +integer or a pointer, takes up 4 bytes on the stack. You should be able +to take advantage of this to avoid writing much near-identical code for +retrieving each system call's arguments from the stack. diff --git a/doc/userprog.tmpl b/doc/userprog.tmpl new file mode 100644 index 0000000..b2e782a --- /dev/null +++ b/doc/userprog.tmpl @@ -0,0 +1,116 @@ + +-------------------------+ + | OS 211 | + | TASK 2: USER PROGRAMS | + | DESIGN DOCUMENT | + +-------------------------+ + +---- GROUP ---- + +>> Fill in the names and email addresses of your group members. + +FirstName LastName +FirstName LastName +FirstName LastName + +---- PRELIMINARIES ---- + +>> If you have any preliminary comments on your submission, or notes for the +>> markers, please give them here. + +>> Please cite any offline or online sources you consulted while preparing your +>> submission, other than the PintOS documentation, course text, lecture notes +>> and course staff. + + ARGUMENT PASSING + ================ + +---- DATA STRUCTURES ---- + +>> A1: (1 mark) +>> Copy here the declaration of each new or changed `struct' or `struct' member, +>> global or static variable, `typedef', or enumeration. +>> Identify the purpose of each in roughly 25 words. + +---- ALGORITHMS ---- + +>> A2: (2 marks) +>> How does your argument parsing code avoid overflowing the user's stack page? +>> What are the efficiency considerations of your approach? + +---- RATIONALE ---- + +>> A3: (2 marks) +>> PintOS does not implement strtok() because it is not thread safe. +>> Explain the problem with strtok() and how strtok_r() avoids this issue. + +>> A4: (3 marks) +>> In PintOS, the kernel separates commands into an executable name and arguments. +>> In Unix-like systems, the shell does this separation. +>> Identify three advantages of the Unix approach. + + SYSTEM CALLS + ============ + +---- DATA STRUCTURES ---- + +>> B1: (6 marks) +>> Copy here the declaration of each new or changed `struct' or `struct' member, +>> global or static variable, `typedef', or enumeration. +>> Identify the purpose of each in roughly 25 words. + +---- ALGORITHMS ---- + +>> B2: (2 marks) +>> Describe how your code ensures safe memory access of user provided data from +>> within the kernel. + +>> B3: (3 marks) +>> Suppose that we choose to verify user provided pointers by validating them +>> before use (i.e. using the first method described in the spec). +>> What is the least and the greatest possible number of inspections of the page +>> table (e.g. calls to pagedir_get_page()) that would need to be made in the +>> following cases? +>> a) A system call that passes the kernel a pointer to 10 bytes of user data. +>> b) A system call that passes the kernel a pointer to a full page +>> (4,096 bytes) of user data. +>> c) A system call that passes the kernel a pointer to 4 full pages +>> (16,384 bytes) of user data. +>> You must briefly explain the checking tactic you would use and how it applies +>> to each case to generate your answers. + +>> B4: (2 marks) +>> When an error is detected during a system call handler, how do you ensure +>> that all temporarily allocated resources (locks, buffers, etc.) are freed? + +>> B5: (8 marks) +>> Describe your implementation of the "wait" system call and how it interacts +>> with process termination for both the parent and child. + +---- SYNCHRONIZATION ---- + +>> B6: (2 marks) +>> The "exec" system call returns -1 if loading the new executable fails, so it +>> cannot return before the new executable has completed loading. +>> How does your code ensure this? +>> How is the load success/failure status passed back to the thread that calls +>> "exec"? + +>> B7: (5 marks) +>> Consider parent process P with child process C. +>> How do you ensure proper synchronization and avoid race conditions when: +>> i) P calls wait(C) before C exits? +>> ii) P calls wait(C) after C exits? +>> iii) P terminates, without waiting, before C exits? +>> iv) P terminates, without waiting, after C exits? +>> Additionally, how do you ensure that all resources are freed regardless of +>> the above case? + +---- RATIONALE ---- + +>> B8: (2 marks) +>> Why did you choose to implement safe access of user memory from the kernel in +>> the way that you did? + +>> B9: (2 marks) +>> What advantages and disadvantages can you see to your design for file +>> descriptors? diff --git a/doc/vm.texi b/doc/vm.texi new file mode 100644 index 0000000..19baef3 --- /dev/null +++ b/doc/vm.texi @@ -0,0 +1,835 @@ +@node Task 3--Virtual Memory +@chapter Task 3: Virtual Memory + +By now you should have some familiarity with the inner workings of +PintOS. Your OS can properly handle multiple threads of execution with proper +synchronization, and can load multiple user programs at once. However, +the number and size of programs that can run is limited by the machine's +main memory size. In this assignment, you will remove that limitation. + +You will build this assignment on top of the last one. Test programs +from task 2 should also work with task 3. You should take care to +fix any bugs in your task 2 submission before you start work on +task 3, because those bugs will most likely cause the same problems +in task 3. + +You will continue to handle PintOS disks and file systems the same way +you did in the previous assignment (@pxref{Using the File System}). + +@menu +* Task 3 Background:: +* Task 3 Suggested Order of Implementation:: +* Task 3 Requirements:: +* Task 3 FAQ:: +@end menu + +@node Task 3 Background +@section Background + +@menu +* Task 3 Source Files:: +* Memory Terminology:: +* Resource Management Overview:: +* Managing the Supplemental Page Table:: +* Managing the Frame Table:: +* Accessed and Dirty Bits:: +* Managing the Table of File Mappings:: +* Managing the Swap Partition:: +* Managing Memory Mapped Files Back:: +@end menu + +@node Task 3 Source Files +@subsection Source Files + +You will work in the @file{vm} directory for this task. The +@file{vm} directory contains only @file{Makefile}s. The only +change from @file{userprog} is that this new @file{Makefile} turns on +the setting @option{-DVM}. All code you write will be in new +files or in files introduced in earlier tasks. + +You will probably be encountering just a few files for the first time: + +@table @file +@item devices/block.h +@itemx devices/block.c +Provides sector-based read and write access to block devices. + +@item devices/swap.h +@itemx devices/swap.c +Provides page-based read and write access to the swap partition. +You will use this interface to access the swap partition, as wrapper around a block device. +@end table + +@node Memory Terminology +@subsection Memory Terminology + +Careful definitions are needed to keep discussion of virtual memory from +being confusing. Thus, we begin by presenting some terminology for +memory and storage. Some of these terms should be familiar from task +2 (@pxref{Virtual Memory Layout}), but much of it is new. + +@menu +* Pages:: +* Frames:: +* Page Tables:: +* Swap Slots:: +@end menu + +@node Pages +@subsubsection Pages + +A @dfn{page}, sometimes called a @dfn{virtual page}, is a continuous +region of virtual memory 4,096 bytes (the @dfn{page size}) in length. A +page must be @dfn{page-aligned}, that is, start on a virtual address +evenly divisible by the page size. Thus, a 32-bit virtual address can +be divided into a 20-bit @dfn{page number} and a 12-bit @dfn{page +offset} (or just @dfn{offset}), like this: + +@example +@group + 31 12 11 0 + +-------------------+-----------+ + | Page Number | Offset | + +-------------------+-----------+ + Virtual Address +@end group +@end example + +Each process has an independent set of @dfn{user virtual pages}, which +are those pages below virtual address @code{PHYS_BASE}, typically +@t{0xc0000000} (3 GB). The set of @dfn{kernel virtual pages}, on the +other hand, is global, remaining the same regardless of what thread or +process is active. The kernel may access both user virtual and kernel virtual pages, +but a user process may access only its own user virtual pages. @xref{Virtual +Memory Layout}, for more information. + +PintOS provides several useful functions for working with virtual +addresses. @xref{Virtual Addresses}, for details. + +@node Frames +@subsubsection Frames + +A @dfn{frame}, sometimes called a @dfn{physical frame} or a @dfn{page +frame}, is a continuous region of physical memory. Like pages, frames +must be page-size and page-aligned. Thus, a 32-bit physical address can +be divided into a 20-bit @dfn{frame number} and a 12-bit @dfn{frame +offset} (or just @dfn{offset}), like this: + +@example +@group + 31 12 11 0 + +-------------------+-----------+ + | Frame Number | Offset | + +-------------------+-----------+ + Physical Address +@end group +@end example + +The 80@var{x}86 doesn't provide any way to directly access memory at a +physical address. PintOS works around this by mapping kernel virtual +memory directly to physical memory: the first page of kernel virtual +memory is mapped to the first frame of physical memory, the second page +to the second frame, and so on. Thus, frames can be accessed through +kernel virtual memory. + +PintOS provides functions for translating between physical addresses and +kernel virtual addresses. @xref{Virtual Addresses}, for details. + +@node Page Tables +@subsubsection Page Tables + +In PintOS, a @dfn{page table} is a data structure that the CPU uses to +translate a virtual address to a physical address, that is, from a page +to a frame. The page table format is dictated by the 80@var{x}86 +architecture. PintOS provides page table management code in +@file{pagedir.c} (@pxref{Page Table}). + +The diagram below illustrates the relationship between pages and frames. +The virtual address, on the left, consists of a page number and an +offset. The page table translates the page number into a frame number, +which is combined with the unmodified offset to obtain the physical +address, on the right. + +@example +@group + +----------+ + .--------------->|Page Table|-----------. + / +----------+ | + 31 | 12 11 0 31 | 12 11 0 + +---------+----+ +---------+----+ + |Page Nr | Ofs| |Frame Nr | Ofs| + +---------+----+ +---------+----+ + Virt Addr | Phys Addr | + \_______________________________________/ +@end group +@end example + +@node Swap Slots +@subsubsection Swap Slots + +A @dfn{swap slot} is a continuous, page-size region of disk space in the +swap partition. Although hardware limitations dictating the placement of +slots are looser than for pages and frames, swap slots should be +page-aligned because there is no downside in doing so. + +@node Resource Management Overview +@subsection Resource Management Overview + +You will need to design the following data structures: + +@table @asis +@item Supplemental page table + +Enables page fault handling by supplementing the page table. +@xref{Managing the Supplemental Page Table}. + +@item Frame table + +Allows efficient implementation of eviction policy. +@xref{Managing the Frame Table}. + +@item Table of file mappings + +Processes may map files into their virtual memory space. You need a +table to track which files are mapped into which pages. +@end table + +You do not necessarily need to implement three completely distinct data +structures: it may be convenient to wholly or partially merge related +resources into a unified data structure. + +For each data structure, you need to determine what information each +element should contain. You also need to decide on the data structure's +scope, either local (per-process) or global (applying to the whole +system), and how many instances are required within its scope. + +To simplify your design, you may store these data structures in +non-pageable memory (i.e. kernel space). +That means that you can be sure that pointers among them will remain valid. + +Possible choices of data structures include arrays, lists, bitmaps, and +hash tables. An array is often the simplest approach, but a sparsely +populated array wastes memory. Lists are also simple, but traversing a +long list to find a particular position wastes time. Both arrays and +lists can be resized, but lists more efficiently support insertion and +deletion in the middle. + +PintOS includes a bitmap data structure in @file{lib/kernel/bitmap.c} +and @file{lib/kernel/bitmap.h}. A bitmap is an array of bits, each of +which can be true or false. Bitmaps are typically used to track usage +in a set of (identical) resources: if resource @var{n} is in use, then +bit @var{n} of the bitmap is true. PintOS bitmaps are fixed in size, +although you could extend their implementation to support resizing. + +PintOS also includes a hash table data structure (@pxref{Hash Table}). +PintOS hash tables efficiently support insertions and deletions over a +wide range of table sizes. + +Although more complex data structures may yield performance or other +benefits, they may also needlessly complicate your implementation. +Thus, we do not recommend implementing any advanced data structure +(e.g.@: a balanced binary tree) as part of your design. + +@node Managing the Supplemental Page Table +@subsection Managing the Supplemental Page Table + +The @dfn{supplemental page table} extends the page table with +additional data about each page. It is needed because of the +limitations imposed by the page table's format. Such a data structure +is also often referred to as a ``page table''; we add the word ``supplemental'' +to reduce confusion. + +The supplemental page table is used for at least two purposes. Most +importantly, on a page fault, the kernel looks up the virtual page that +faulted in the supplemental page table to find out what data should be +there. Second, the kernel consults the supplemental page table when a +process terminates, to decide what resources to free. + +You may organize the supplemental page table as you wish. There are at +least two basic approaches to its organization: in terms of segments or +in terms of pages. Optionally, you may use the page table itself as an +index to track the members of the supplemental page table. You will +have to modify the PintOS page table implementation in @file{pagedir.c} +to do so. We recommend this approach for advanced students only. +@xref{Page Table Entry Format}, for more information. + +The most important user of the supplemental page table is the page fault +handler. In task 2, a page fault always indicated a bug in the +kernel or a user program. In task 3, this is no longer true. Now, a +page fault might only indicate that the page must be brought in from a +file or swap. You will have to implement a more sophisticated page +fault handler to handle these cases. Your page fault handler, which you +should implement by modifying @func{page_fault} in +@file{userprog/exception.c}, needs to do roughly the following: + +@enumerate 1 +@item +Locate the page that faulted in the supplemental page table. If the +memory reference is valid, use the supplemental page table entry to +locate the data that goes in the page, which might be in the file +system, or in a swap slot, or it might simply be an all-zero page. When +you implement sharing, the page's data might even already be in a page +frame, but not in the page table. + +If the supplemental page table indicates that the user process should +not expect any data at the address it was trying to access, or if the +page lies within kernel virtual memory, or if the access is an attempt +to write to a read-only page, then the access is invalid. Any invalid +access terminates the process and thereby frees all of its resources. + +@item +Obtain a frame to store the page. @xref{Managing the Frame Table}, for +details. + +When you implement sharing, the data you need may already be in a frame, +in which case you must be able to locate that frame. + +@item +Fetch the data into the frame, by reading it from the file system or +swap, zeroing it, etc. + +When you implement sharing, the page you need may already be in a frame, +in which case no action is necessary in this step. + +@item +Point the page table entry for the faulting virtual address to the frame. +You can use the functions in @file{userprog/pagedir.c}. +@end enumerate + +@node Managing the Frame Table +@subsection Managing the Frame Table + +The @dfn{frame table} contains one entry for each frame that contains a +user page. Each entry in the frame table contains a pointer to the +page, if any, that currently occupies it, and other data of your choice. +The frame table allows PintOS to efficiently implement an eviction +policy, by choosing a page to evict when no frames are free. + +The frames used for user pages should be obtained from the ``user +pool,'' by calling @code{palloc_get_page(PAL_USER)}. You must use +@code{PAL_USER} to avoid allocating from the ``kernel pool,'' which +could cause some test cases to fail unexpectedly (@pxref{Why +PAL_USER?}). If you modify @file{palloc.c} as part of your frame table +implementation, be sure to retain the distinction between the two pools. + +The most important operation on the frame table is obtaining an unused +frame. This is easy when a frame is free. When none is free, a frame +must be made free by evicting some page from its frame. + +If no frame can be evicted without allocating a swap slot, but swap is +full, panic the kernel. Real OSes apply a wide range of policies to +recover from or prevent such situations, but these policies are beyond +the scope of this task. + +The process of eviction comprises roughly the following steps: + +@enumerate 1 +@item +Choose a frame to evict, using your page replacement algorithm. The +``accessed'' and ``dirty'' bits in the page table, described below, will +come in handy. + +@item +Remove references to the frame from any page table that refers to it. + +Until you have implemented sharing, only a single page should refer to +a frame at any given time. + +@item +If necessary, write the page to the file system or to swap. +@end enumerate + +The evicted frame may then be used to store a different page. + +@node Accessed and Dirty Bits +@subsubsection Accessed and Dirty Bits + +80@var{x}86 hardware provides some assistance for implementing page +replacement algorithms, through a pair of bits in the page table entry +(PTE) for each page. On any read or write to a page, the CPU sets the +@dfn{accessed bit} to 1 in the page's PTE, and on any write, the CPU +sets the @dfn{dirty bit} to 1. The CPU never resets these bits to 0, +but the OS may do so. + +You need to be aware of @dfn{aliases}, that is, two (or more) pages that +refer to the same frame. When an aliased frame is accessed, the +accessed and dirty bits are updated in only one page table entry (the +one for the page used for access). The accessed and dirty bits for the +other aliases are not updated. + +In PintOS, every user virtual page is aliased to its kernel virtual +page. You must manage these aliases somehow. For example, your code +could check and update the accessed and dirty bits for both addresses. +Alternatively, the kernel could avoid the problem by only accessing user +data through the user virtual address. + +Other aliases should only arise once you implement sharing, or if there is a bug in your code. + +@xref{Page Table Accessed and Dirty Bits}, for details of the functions +to work with accessed and dirty bits. + +@node Managing the Table of File Mappings +@subsection Managing the Table of File Mappings + +In order to implement sharing of read-only executable pages, you will need to track which files are mapped to which page. +We suggest that you create a table, or nested data-structure, to store this information. +This table only needs to store details about read-only executable pages. +Do not confuse this with memory-mapped files, which you will probably want to manage separately. + +There are a couple of functions in @file{filesys/file.c} that you might find very helpful when impelementing sharing. +The @func{file_compare} function can be used to check if two file structs (@code{file1} and @code{file2}) +are referencing the same underlying file (i.e. inode). +The @func{file_hash} function is a hashing function that also operates on the internal underlying file representation. + +@node Managing the Swap Partition +@subsection Managing the Swap Partition + +PintOS provides a complete impelentation of a swap partition manager, that wraps around a block device. +This includes an internal swap table to track in-use and free swap slots. +The @func{swap_out} function can be used to pick an unused swap slot when evicting a page @code{vaddr} from its frame 'out' to the swap partition. +The @func{swap_in} function can be used to restore a page 'in' to memory at @code{vaddr} and free its swap @code{slot}. +You can also use the @func{swap_drop} function to free a swap @code{slot}, for example when the owning process is terminated. + +Internally, the swap partition makes use of the @code{BLOCK_SWAP} block device for swapping. +It obtainins the @struct{block} that represents it by calling @func{block_get_role}. +From the @file{vm/build} directory, use the command @code{pintos-mkdisk swap.dsk +--swap-size=@var{n}} to create an disk named @file{swap.dsk} that contains a @var{n}-MB swap partition. +Afterward, @file{swap.dsk} will automatically be attached as an extra disk when you run @command{pintos}. +Alternatively, you can tell @command{pintos} to use a temporary @var{n}-MB swap disk for a single +run with @option{--swap-size=@var{n}}. + +Swap slots should be allocated lazily, that is, only when they are actually required by eviction. +Reading data pages from the executable and writing them to swap immediately at process startup is not lazy. +Swap slots should also not be reserved to store particular pages. + +@node Managing Memory Mapped Files Back +@subsection Managing Memory Mapped Files + +The file system is most commonly accessed with @code{read} and +@code{write} system calls. A secondary interface is to ``map'' the file +into virtual pages, using the @code{mmap} system call. The program can +then use memory instructions directly on the file data. + +Suppose file @file{foo} is @t{0x1000} bytes (4 kB, or one page) long. +If @file{foo} is mapped into memory starting at address @t{0x5000}, then +any memory accesses to locations @t{0x5000}@dots{}@t{0x5fff} will access +the corresponding bytes of @file{foo}. + +Here's a program that uses @code{mmap} to print a file to the console. +It opens the file specified on the command line, maps it at virtual +address @t{0x10000000}, writes the mapped data to the console (fd 1), +and unmaps the file. + +@example +#include +#include +int main (int argc UNUSED, char *argv[]) +@{ + void *data = (void *) 0x10000000; /* @r{Address at which to map.} */ + + int fd = open (argv[1]); /* @r{Open file.} */ + mapid_t map = mmap (fd, data); /* @r{Map file.} */ + write (1, data, filesize (fd)); /* @r{Write file to console.} */ + munmap (map); /* @r{Unmap file (optional).} */ + return 0; +@} +@end example + +A similar program with full error handling is included as @file{mcat.c} +in the @file{examples} directory, which also contains @file{mcp.c} as a +second example of @code{mmap}. + +Your submission must be able to track what memory is used by memory +mapped files. This is necessary to properly handle page faults in the +mapped regions and to ensure that mapped files do not overlap any other +segments within the process. + +@node Task 3 Suggested Order of Implementation +@section Suggested Order of Implementation + +We suggest the following initial order of implementation: + +@enumerate 1 +@item +Frame table (@pxref{Managing the Frame Table}). Change @file{process.c} +to use your frame table allocator. + +Do not implement swapping yet. If you run out of frames, fail the +allocator or panic the kernel. + +After this step, your kernel should still pass all the task 2 test +cases. + +@item +Supplemental page table and page fault handler (@pxref{Managing the Supplemental Page Table}). +Change @file{process.c} to lazy-load a process's executable +by recording the necessary information for each page in the supplemental page table during @code{load_segment}. +Implement the actual loading of these code and data segments in the page fault handler. +For now, consider only valid accesses. + +After this step, your kernel should pass all of the task 2 +functionality test cases, but only some of the robustness tests. + +@item +From here, you can implement stack growth, mapped files, sharing and page +reclamation on process exit in parallel. + +@item +The next step is to implement eviction (@pxref{Managing the Frame +Table}). Initially you could choose the page to evict randomly. At +this point, you need to consider how to manage accessed and dirty bits +and aliasing of user and kernel pages. Synchronization is also a +concern: how do you deal with it if process A faults on a page whose +frame process B is in the process of evicting? +@end enumerate + +@node Task 3 Requirements +@section Requirements + +This assignment is an open-ended design problem. We are going to say as +little as possible about how to do things. Instead we will focus on +what functionality we require your OS to support. We will expect +you to come up with a design that makes sense. You will have the +freedom to choose how to handle page faults, how to organize the swap +partition, how to implement paging, etc. + +@menu +* Task 3 Design Document:: +* Paging:: +* Stack Growth:: +* Memory Mapped Files:: +@end menu + +@node Task 3 Design Document +@subsection Design Document + +When you submit your work for task 3, you must also submit a completed copy of +@uref{vm.tmpl, , the task 3 design document template}. +You can find a template design document for this task in @file{pintos/doc/vm.tmpl} and also on CATe. +You are free to submit your design document as either a @file{.txt} or @file{.pdf} file. +We recommend that you read the design document template before you start working on the task. +@xref{Task Documentation}, for a sample design document that goes along with a fictitious task. + +@node Paging +@subsection Paging + +Implement paging for segments loaded from executables. All of these +pages should be loaded lazily, that is, only as the kernel intercepts +page faults for them. Upon eviction, pages modified since load (e.g. data +segment pages), as indicated by the ``dirty bit'', should be written to swap. +Unmodified pages, including read-only pages, should never be written to +swap because they can always be read back from the executable. + +Your design should allow for parallelism. If one page fault requires +I/O, in the meantime processes that do not fault should continue +executing and other page faults that do not require I/O should be able +to complete. This will require some synchronization effort. + +You'll need to modify the core of the program loader, which is the loop +in @func{load_segment} in @file{userprog/process.c}. Each time around +the loop, @code{page_read_bytes} receives the number of bytes to read +from the executable file and @code{page_zero_bytes} receives the number +of bytes to initialize to zero following the bytes read. The two always +sum to @code{PGSIZE} (4,096). The handling of a page depends on these +variables' values: + +@itemize @bullet +@item +If @code{page_read_bytes} equals @code{PGSIZE}, the page should be demand +paged from the underlying file on its first access. + +@item +If @code{page_zero_bytes} equals @code{PGSIZE}, the page does not need to +be read from disk at all because it is all zeroes. You should handle +such pages by creating a new page consisting of all zeroes at the +first page fault. + +@item +Otherwise, neither @code{page_read_bytes} nor @code{page_zero_bytes} +equals @code{PGSIZE}. In this case, an initial part of the page is to +be read from the underlying file and the remainder zeroed. +@end itemize + +Watch out for executable segments that share a page in memory, and thus overlap in the page-table. +The provided code in @file{userprog/process.c} already handles this by checking during @code{load_segment} if any @code{upage} has already been installed. In such a case, rather than allocating/installing a new page of memory, the existing page is updated instead. +You will need to do something similar in your supplemental page table. + +@node Stack Growth +@subsection Stack Growth + +Implement stack growth. +In task 2, the stack was limited a single page at the top of the user virtual address space and user programs would crash if they exceeded this limit. +Now, if the stack grows past its current size, you should allocate additional pages as necessary. + +You should allocate additional stack pages only if the corresponding page fault ``appears'' to be a stack access. +To this end, you will need to devise a heuristic that attempts to distinguish stack accesses from other accesses. + +User programs are buggy if they write to the stack below the stack +pointer, because typical real OSes may interrupt a process at any time +to deliver a ``signal,'' which pushes data on the stack.@footnote{This rule is +common but not universal. One modern exception is the +@uref{http://www.x86-64.org/documentation/abi.pdf, @var{x}86-64 System V +ABI}, which designates 128 bytes below the stack pointer as a ``red +zone'' that may not be modified by signal or interrupt handlers.} +However, the 80@var{x}86 @code{PUSH} instruction checks access +permissions before it adjusts the stack pointer, so it may cause a page +fault 4 bytes below the stack pointer. (Otherwise, @code{PUSH} would +not be restartable in a straightforward fashion.) Similarly, the +@code{PUSHA} instruction pushes 32 bytes at once, so it can fault 32 +bytes below the stack pointer. + +You will need to be able to obtain the current value of the user +program's stack pointer. Within a system call or a page fault generated +by a user program, you can retrieve it from the @code{esp} member of the +@struct{intr_frame} passed to @func{syscall_handler} or +@func{page_fault}, respectively. If you verify user pointers before +accessing them (@pxref{Accessing User Memory}), these are the only cases +you need to handle. On the other hand, if you depend on page faults to +detect invalid memory access, you will need to handle another case, +where a page fault occurs in the kernel. Since the processor only +saves the stack pointer when an exception causes a switch from user +to kernel mode, reading @code{esp} out of the @struct{intr_frame} +passed to @func{page_fault} would yield an undefined value, not the +user stack pointer. You will need to arrange another way, such as +saving @code{esp} into @struct{thread} on the initial transition +from user to kernel mode. + +You should impose some absolute limit on stack size, as do most OSes. +Some OSes make the limit user-adjustable, e.g.@: with the +@command{ulimit} command on many Unix systems. +On many GNU/Linux systems, the default limit is 8 MB. + +The first stack page need not be allocated lazily. You can allocate +and initialize it with the command line arguments at load time, with +no need to wait for it to be faulted in. + +All stack pages should be candidates for eviction. An evicted stack +page should be written to swap. + +@node Memory Mapped Files +@subsection Memory Mapped Files + +Implement memory mapped files, including the following system calls. + +@deftypefn {System Call} mapid_t mmap (int @var{fd}, void *@var{addr}) +Maps the file open as @var{fd} into the process's virtual address +space. The entire file is mapped into consecutive virtual pages +starting at @var{addr}. + +Your VM system must lazily load pages in @code{mmap} regions and use the +@code{mmap}ed file itself as backing store for the mapping. That is, +evicting a page mapped by @code{mmap} writes it back to the file it was +mapped from. + +If the file's length is not a multiple of @code{PGSIZE}, then some +bytes in the final mapped page ``stick out'' beyond the end of the +file. Set these bytes to zero when the page is faulted in from the +file system, +and discard them when the page is written back to disk. + +If successful, this function returns a ``mapping ID'' that +uniquely identifies the mapping within the process. On failure, +it must return -1, which otherwise should not be a valid mapping id, +and the process's mappings must be unchanged. + +A call to @code{mmap} may fail if the file open as @var{fd} has a +length of zero bytes. It must fail if @var{addr} is not page-aligned +or if the range of pages mapped overlaps any existing set of mapped +pages, including the space reserved for the stack +or pages mapped at executable load time. +It must also fail if @var{addr} is 0, because some PintOS code assumes +virtual page 0 is not mapped. Finally, file descriptors 0 and 1, +representing console input and output, are not mappable. +@end deftypefn + +@deftypefn {System Call} void munmap (mapid_t @var{mapping}) +Unmaps the mapping designated by @var{mapping}, which must be a +mapping ID returned by a previous call to @code{mmap} by the same +process that has not yet been unmapped. +@end deftypefn + +All mappings are implicitly unmapped when a process exits, whether via +@code{exit} or by any other means. When a mapping is unmapped, whether +implicitly or explicitly, all pages written to by the process are +written back to the file, and pages not written must not be. The pages +are then removed from the process's list of virtual pages. + +Closing or removing a file does not unmap any of its mappings. Once +created, a mapping is valid until @code{munmap} is called or the process +exits, following the Unix convention. @xref{Removing an Open File}, for +more information. You should use the @code{file_reopen} function to +obtain a separate and independent reference to the file for each of +its mappings. + +If two or more processes map the same file, there is no requirement that +they see consistent data. Unix handles this by making the two mappings +share the same physical page, but the Unix @code{mmap} system call also has +an argument allowing the client to specify whether the page is shared or +private (i.e.@: copy-on-write). + +@subsection Accessing User Memory +You will need to adapt your code to access user memory (@pxref{Accessing +User Memory}) while handling a system call. Just as user processes may +access pages whose content is currently in a file or in swap space, so +can they pass addresses that refer to such non-resident pages to system +calls. Moreover, unless your kernel takes measures to prevent this, +a page may be evicted from its frame even while it is being accessed +by kernel code. If kernel code accesses such non-resident user pages, +a page fault will result. + +While accessing user memory, your kernel must either be prepared to handle +such page faults, or it must prevent them from occurring. The kernel +must prevent such page faults while it is holding resources it would +need to acquire to handle these faults. In PintOS, such resources include +locks acquired by the device driver(s) that control the device(s) containing +the file system and swap space. As a concrete example, you must not +allow page faults to occur while a device driver accesses a user buffer +passed to @code{file_read}, because you would not be able to invoke +the driver while handling such faults. + +Preventing such page faults requires cooperation between the code within +which the access occurs and your page eviction code. For instance, +you could extend your frame table to record when a page contained in +a frame must not be evicted. (This is also referred to as ``pinning'' +or ``locking'' the page in its frame.) Pinning restricts your page +replacement algorithm's choices when looking for pages to evict, so be +sure to pin pages no longer than necessary, and avoid pinning pages when +it is not necessary. + +@node Task 3 FAQ +@section FAQ + +@table @b +@item How much code will I need to write? + +Here's a summary of our reference solution, produced by the +@command{diffstat} program. The final row gives total lines inserted +and deleted; a changed line counts as both an insertion and a deletion. + +@verbatim + Makefile.build | 4 +- + threads/init.c | 5 + + threads/interrupt.c | 2 + + threads/thread.c | 26 +- + threads/thread.h | 37 ++- + userprog/exception.c | 12 +- + userprog/pagedir.c | 10 +- + userprog/process.c | 355 +++++++++++++----- + userprog/syscall.c | 612 ++++++++++++++++++++++++++++++- + userprog/syscall.h | 1 + + vm/frame.c | 162 +++++++++ + vm/frame.h | 23 + + vm/page.c | 293 ++++++++++++++++ + vm/page.h | 51 ++ + 14 files changed, 1489 insertions(+), 104 deletions(-) +@end verbatim + +This summary is relative to the PintOS base code, but the reference +solution for task 3 starts from the reference solution to task 2. +@xref{Task 2 FAQ}, for the summary of task 2. + +The reference solution represents just one possible solution. Many +other solutions are also possible and many of those differ greatly from +the reference solution. Some excellent solutions may not modify all the +files modified by the reference solution, and some may modify files not +modified by the reference solution. + +@item Do we need a working Task 2 to implement Task 3? + +Yes. + +@item How complex does our page replacement algorithm need to be? +@anchor{VM Extra Credit} +If you implement an advanced page replacement algorithm, +such as the ``second chance'' or the ``clock'' algorithms, +then you will get more marks for this part of the task. + +You should also implement sharing: when multiple processes are created that use +the same executable file, share read-only pages among those processes +instead of creating separate copies of read-only segments for each +process. If you carefully designed your data structures, +sharing of read-only pages should not make this part significantly +harder. + +@item Do we need to handle paging for both user virtual memory and kernel virtual memory? + +No, you only need to implement paging for user virtual memory. +One of the golden rules of OS development is ``Don't page out the paging code!'' + +@item How do we resume a process after we have handled a page fault? + +Returning from @func{page_fault} resumes the current user process +(@pxref{Internal Interrupt Handling}). +It will then retry the instruction to which the instruction pointer points. + +@item Why do user processes sometimes fault above the stack pointer? + +You might notice that, in the stack growth tests, the user program faults +on an address that is above the user program's current stack pointer, +even though the @code{PUSH} and @code{PUSHA} instructions would cause +faults 4 and 32 bytes below the current stack pointer. + +This is not unusual. The @code{PUSH} and @code{PUSHA} instructions are +not the only instructions that can trigger user stack growth. +For instance, a user program may allocate stack space by decrementing the +stack pointer using a @code{SUB $n, %esp} instruction, and then use a +@code{MOV ..., m(%esp)} instruction to write to a stack location within +the allocated space that is @var{m} bytes above the current stack pointer. +Such accesses are perfectly valid, and your kernel must grow the +user program's stack to allow those accesses to succeed. + +@item Does the virtual memory system need to support data segment growth? + +No. The size of the data segment is determined by the linker. We still +have no dynamic allocation in PintOS (although it is possible to +``fake'' it at the user level by using memory-mapped files). Supporting +data segment growth should add little additional complexity to a +well-designed system. + +@item Why should I use @code{PAL_USER} for allocating page frames? +@anchor{Why PAL_USER?} + +Passing @code{PAL_USER} to @func{palloc_get_page} causes it to allocate +memory from the user pool, instead of the main kernel pool. Running out +of pages in the user pool just causes user programs to page, but running +out of pages in the kernel pool will cause many failures because so many +kernel functions need to obtain memory. +You can layer some other allocator on top of @func{palloc_get_page} if +you like, but it should be the underlying mechanism. + +Also, you can use the @option{-ul} kernel command-line option to limit +the size of the user pool, which makes it easy to test your VM +implementation with various user memory sizes. + +@item What should we do if the stack grows into a @code{mmap} file? + +This should not be possible. +The specification of @code{mmap()} rules out creating mappings within the possible stack space, +so you should abort any attempt to create a mapping within that space. +The stack should also not be able to grow beyond it's reserved stack space, +thus ruling out the possibility of any such overlap. + +@item What should I expect from the Task 3 code-review? + +The code-review for this task will be conducted with each group in-person. +Our Task 3 code-review will cover @strong{four} main areas: +functional correctness, efficiency, design quality and general coding style. + +@itemize @bullet +@item For @strong{functional correctness}, we will be looking to see if your code for page sharing accurately tracks the accessed/dirty status of each shared page and if your stack-fault heuristic is correct. +We will also be checking if your code for page allocation, page fault handling and memory mapping/unmapping is free of any race conditions. + +@item For @strong{efficiency}, we will be making sure that you only load executable code segments on demand (lazy loading). +We will also be checking to make sure that you have made efficient use of the swap space and that your code is free of any memory leaks. + +@item For @strong{design quality}, we will be looking to see if you have implemented an advanced eviction algorithm +(i.e. an algorithm that considers the properties of the pages in memory in order to chose a good eviction candidate). + +@item For @strong{general coding style}, we will be paying attention to all of the usual elements of good style +that you should be used to from last year (e.g. consistent code layout, appropriate use of comments, avoiding magic numbers, etc.) +as well as your use of git (e.g. commit frequency and commit message quality). +In this task, we will be paying particular attention to any additional efficiency improvements you have made to your eviction algorithm (e.g. encouraging fairness) or the system's overall use of memory (e.g. increased page sharing). +We will also be looking at any use of hash tables, specifically checking that your hash functions are chosen to avoid frequent collisions. +@end itemize + +@end table diff --git a/doc/vm.tmpl b/doc/vm.tmpl new file mode 100644 index 0000000..9a8e81b --- /dev/null +++ b/doc/vm.tmpl @@ -0,0 +1,130 @@ + +--------------------------+ + | OS 211 | + | TASK 3: VIRTUAL MEMORY | + | DESIGN DOCUMENT | + +--------------------------+ + +---- GROUP ---- + +>> Fill in the names and email addresses of your group members. + +FirstName LastName +FirstName LastName +FirstName LastName + +---- PRELIMINARIES ---- + +>> If you have any preliminary comments on your submission, or notes for the +>> markers, please give them here. + +>> Please cite any offline or online sources you consulted while preparing your +>> submission, other than the PintOS documentation, course text, lecture notes +>> and course staff. + + PAGE TABLE MANAGEMENT AND LAZY LOADING + ====================================== + +---- DATA STRUCTURES ---- + +>> A1: (2 marks) +>> Copy here the declaration of each new or changed `struct' or `struct' member, +>> global or static variable, `typedef', or enumeration that relates to your +>> supplemental page table and table of file mappings. +>> Identify the purpose of each in roughly 25 words. + +---- ALGORITHMS ---- + +>> A2: (2 marks) +>> Describe your code for finding the location of a given page that is not +>> currently loaded into memory. + +>> A3: (2 marks) +>> How have you implemented sharing of read only pages? + +>> A4: (2 marks) +>> When a process P obtains a frame that was previously used by a process Q, +>> how do you adjust the page directory of process Q (and any other data +>> structures) to reflect the frame Q no longer has? + +---- SYNCHRONIZATION ---- + +>> A5: (2 marks) +>> Explain how you handle access to user pages that are not present when a +>> system call is made. + +---- RATIONALE ---- + +>> A6: (2 marks) +>> Why did you choose the data structure(s) that you did for representing the +>> supplemental page table and table of file mappings? + + FRAME TABLE MANAGEMENT AND EVICTION + =================================== + +---- DATA STRUCTURES ---- + +>> B1: (1 marks) +>> Copy here the declaration of each new or changed `struct' or `struct' member, +>> global or static variable, `typedef', or enumeration that relates to your +>> frame table. +>> Identify the purpose of each in roughly 25 words. + +---- ALGORITHMS ---- + +>> B2: (2 marks) +>> When a frame is required but none is free, some frame must be evicted. +>> Describe your code for choosing a frame to evict. + +---- SYNCHRONIZATION ---- + +>> B3: (2 marks) +>> When two user processes both need a new frame at the same time, how are +>> races avoided? +>> You should consider both when there are and are not free frames +>> available in memory. + +>> B4: (2 marks) +>> A page fault in process P can cause another process Q's frame to be evicted. +>> How do you ensure that Q cannot access or modify that page during the +>> eviction process? + +>> B5: (2 marks) +>> A page fault in process P can cause another process Q's frame to be evicted. +>> How do you avoid a race between P evicting Q's frame and Q faulting the page +>> back in? + +>> B6: (2 marks) +>> Explain how your synchronization design prevents deadlock. +>> (You may want to refer to the necessary conditions for deadlock.) + +---- RATIONALE ---- + +>> B7: (2 marks) +>> There is an obvious trade-off between parallelism and the complexity of your +>> synchronisation methods. +>> Explain where your design falls along this continuum and why you chose to +>> design it this way. + + MEMORY MAPPED FILES + =================== + +---- DATA STRUCTURES ---- + +>> C1: (2 marks) +>> Copy here the declaration of each new or changed `struct' or `struct' member, +>> global or static variable, `typedef', or enumeration that relates to your +>> file mapping table. +>> Identify the purpose of each in roughly 25 words. + +---- ALGORITHMS ---- + +>> C2: (2 marks) +>> Explain how you determine whether a new file mapping overlaps with any +>> existing segment and how you handle such a case. + +---- RATIONALE ---- + +>> C3: (1 mark) +>> Mappings created with "mmap" have similar semantics to those of data +>> demand-paged from executables. +>> How does your code-base take advantage of this? diff --git a/specs/freevga/feedback.htm b/specs/freevga/feedback.htm new file mode 100644 index 0000000..1b60c96 --- /dev/null +++ b/specs/freevga/feedback.htm @@ -0,0 +1,59 @@ + + + + + + + FreeVGA Feedback + + + +
    Home  +
    Hardware Level VGA and SVGA Video Programming Information +Page
    + +
    Feedback Form  +
    +        Note - this form requires that +www.goodnet.com be reachable from your client in order to be sent. If it +does not return with a success message, check the connection and try sending +again. +
    Name: +
    +
    Email: +
    +
    Project/Company/Program: +
    +
    Application of Information: +
    Just Curious +
    Game Programming +
    Demo Programming +
    OS Development +
    Driver Development +
    Other +
    Type of Software: +
    Not Applicable +
    Personal Use +
    Public Domain +
    Freeware +
    Shareware +
    GNU or other +free license +
    Commercial +
    Other +
    Body of Message:
    + +
    + +
    + + +

    Notice: All trademarks used or referred to on this page are the property +of their respective owners. +
    All pages are Copyright © 1997, 1998, J. D. Neal, except where +noted. Permission for utilization and distribution is subject to the terms +of the FreeVGA Project Copyright License. +
      +
      + + diff --git a/specs/freevga/freevga.htm b/specs/freevga/freevga.htm new file mode 100644 index 0000000..7d9c1ed --- /dev/null +++ b/specs/freevga/freevga.htm @@ -0,0 +1,255 @@ + + + + + + + FreeVGA--About the FreeVGA Project + + + +

    Home Intro Completeness +Contribution Membership +Questions Back  +
    Hardware Level VGA and SVGA Video Programming Information +Page
    + +
    About the FreeVGA Project  +
    + + +

    Introduction +
            As a software programmer +for the PC architecture I have noticed that there is plenty of free information +existing on the Internet for programming PC hardware, with the notable +exception of video adapters, MPEG cards and the like. When the VGA was +the standard adapter card in PC's, programming was relatively straightforward. +However, when SVGA adapters appeared on the market, there was little standardization +between separate vendor's products. For this reason, applications and graphical +user interface systems required specialized drivers to utilize the extended +capabilities of the SVGA adapters. Either these specialized drivers were +written by the video card vendor or they had to be written by the application +vendor. Unfortunately due to the cost of specifications and complexity +of hardware, most free or shareware programs supported only the standard +VGA. The goal of this project, under my direction, is to explore the area +of low-level video programming and provide information for programmers +of free software throughout the world. +
            With the growing popularity +of the free software concept, more and more specialized applications are +written every day. Many of these applications could take advantage of the +specialized features of the video hardware but often the information required +is not available. This projects goal is to make that information available +By gaining the cooperation of both programmers and hardware manufacturers +an excellent reference can be developed. Internet technology makes it possible +to provide a free resource updated in a timely fashion as opposed to printed +matter which takes time to print and deliver. + +

    Completeness +
            Why would a low-level programmer +need this reference rather than simply use datasheets and chipset specifications +from the manufacturers themselves? First, the manufacturers may no longer +provide literature on "obsolete" chipsets. Second, such datasheets are +often aimed at hardware designers rather than programmers. Programmers +are trying to implement software on existing hardware rather design hardware. +Many of the details needed to program the hardware are dependent on the +implementation of the video adapter. Datasheets typically only provide +information on one particular component of the video hardware. It is necessary +to understand how the components in the adapter are "wired" together to +be able to program the adapter. This information is rarely found in datasheets +or manufacturer's documentation. Third, as demonstrated on the VGA and +some specific SVGA hardware, there are always programmers who can find +ways to cleverly program the hardware to provide capabilities unimagined +by the manufacturer. To do this, it requires the programmer to have intimate +knowledge of the hardware, as BIOS services provide a "lowest common denominator" +of capability. + +

    Contribution +
            This section is for +those interested in contributing to the FreeVGA Project. The primary objective +of this project is to gather information about video hardware, to verify +this information as best as possible, then to organize the information +in a form usable for any application, and finally to make this information +freely available to all programmers. Because of the non-profit nature of +this project, all information provided is the result of generous contribution +by myself or others. The primary resources required by this project are: +chipset datasheets/documentation, developer kits for video boards, video +adapter boards used for testing and verifying information, and finally +"postcards from the bleeding edge" i.e. information about the real world +problems and their workarounds from video programmers. If you can provide +any of these resources to the project or any other related assistance myself +and other programmers who benefit give thanks to your generosity. Your +name will be forever enshrined on the list of contributors, along with +a link to your homepage if you so desire. +
         I can be reached via the feedback +form. If you wish to donate hardware or documentation, please send +it, along with your name and the link you wish to include in the list of +contributors to: + +

    Joshua Neal +
    FreeVGA Project +
    925 N. Coronado Dr. +
    Gilbert, AZ 85234 + +

    Membership +
            Because of the nature of +this project, any contributor can consider themselves a member if they +wish to do so. As the founder of this project I am willing to donate my +time and resources to ensuring the continuing organization, accuracy, and +usability of the FreeVGA Project's documentation. I will continue to do +this indefinitely, although if the task becomes overwhelming I will solicit +volunteers to assist with the project. There may at some point in the future +be special considerations for vendors that choose to support the projects +goals. + +

    Open-Ended Questions +
            The problem of documenting +video card operation and behavior is difficult because of the large amount +of information available, and because video hardware is constantly evolving, +making documentation a problem of hitting a moving target. Another problem +is that because video cards are projects of human endeavor and due to their +complexity, their implementation often differs from published specifications. +Even two manufacturer's products based upon the same chipset can contain +enough variation to make them separate cases from a programmer's viewpoint. +The FreeVGA Project attempts to provide answers to the following questions: +

      +
    • +How does one detect what VGA/SVGA adapter is present even when no access +to BIOS is available?
    • +
    +        Because video hardware was developed +by many independent vendors along separate evolutionary paths, there is +very little knowledge about how to identify the particular model of video +card present in a machine. Because identifying the particular model is +crucial to utilizing the advanced features of a specific model, this is +an important task that nearly all software written for the SVGA needs to +perform. In many cases, such as when writing programs under an operating +system other than MS-DOS/Windows, it may not be possible nor is it good +practice to access BIOS for determining the specific model. Furthermore, +the more recent PCI bus design is being incorporated into many systems +with non-80x86 chips, such as the PowerPC, Alpha, and even high end workstations. +However, the manufacturers of the hardware may only support Mac and PC +versions of their cards, considering other platforms too much of a niche +market to support. Since their inception in the PC market, most video cards +have had the capability to work with another card (albeit different) in +the same machine. Some newer PCI cards allow multiple cards to be used +in one machine. Until recently this capability has been unsupported by +operating systems and programs. For debugging video routines there is no +equal to having a second monitor attached--one monitor can display the +program's output while the other provides the debugging interface. Note +that the need for a second monitor could be reduced somewhat if better +virtualization of the display hardware was implemented. This project aims +to give programmers the skills and knowledge to better utilize the video +hardware. +
      +
    • +How does one perform standard video operations on a particular card +without utilizing the video BIOS interface?
    • +
    +        BIOS was designed to support +MS-DOS programs on the 8086. Computers have progressed far beyond that +point but BIOS has remained basically the same (with the exception of VESA +BIOS.) Even then, most facilities provided by the video BIOS are not particularly +useful. An example is the BIOS Read and Write Pixel commands. These are +the only BIOS provided method of accessing video memory other than text +functions. Anyone like myself who started learning 8086 assembler to speed +up their graphics discovered this function, and said "Cool. This is going +to be easy." I then ran my first program and discovered that I had just +lost a few orders of magnitude of performance. Thus I started to learn +to interact with the video card hardware directly. VESA BIOS is better, +although I have seen very few on-board implementations that work properly +(if present), usually resulting in the user having to run a TSR program +that provides VESA services in RAM. While VESA BIOS does provide some facilities +for non-real mode problems it still does place a function call penalty +on video code. My biggest complaint is that with VESA BIOS you are restricted +to programming to the lowest common denominator of all video hardware, +and thus to utilize any special features of a chipset, you still have to +learn to program the card directly. Many video cards are now considered +"obsolete" by their manufacturer (or the manufacturer has joined the great +corporation in the sky...) and developer support is no longer available. +The unfortunate problem is that these "obsolete" cards are the same cards +being used by non-profit organizations and schools who could otherwise +reap the benefits of a wide variety of free software. +
      +
    • +What are the specialized hardware features (2D/3D acceleration, hardware +cursor, video acceleration, etc.) does a particular card have and how does +one utilize these features?
    • +
    +       This is probably the area where +the documentation is most important. These features are programmed differently +on each vendor's video hardware, but can improve the performance of a particular +application by several orders of magnitude. Programmers such as video game +programmers and assembly demo programmers have demonstrated that by pushing +hardware to its limits, previously inconceivable animation and special +effects are possible. Recent advances in 3D acceleration have made virtual +reality on the desktop a possibility. It is crucial to developers that +they be able to thoroughly understand the hardware's operation to maximize +its performance. +
      +
    • +What are the differences between specific implementations of particular +chipsets, and if so how does one write software that works with these differences?
    • +
    +      Even programmers programming for +the relatively standard VGA hardware can run into problems in this area. +This is the reason so many packages state support for IBM VGA or 100% compatible. +Frequently programmers encounter slight differences in hardware that, under +specific circumstances can cause their programs to fail to operate properly. +If programmers had detailed documentation of the hardware differences of +specific implementations, programmers could, and are generally willing +to, write workarounds in their code in order to provide support for this +hardware. Occasionally subtle hardware problems arise in a particular version +of a board and is corrected in a later revision (possibly by simply revising +the BIOS.) It is important to recognize the earlier version and be able +to write software that can deal with its particular problem. In addition, +many chipsets are designed in such a way that they can work with a variety +of support devices such as clock generators and Video DACs. It is important +to know how to detect and control these support devices, which may (and +usually is) be different in every implementation. Some of these devices +could be interchanged with pin-compatible devices which could provide additional +functionality. However, this would require special programming to utilize +the device's features. +
      +
    • +How does one perform diagnostics on a particular video card in order +to identify inoperative, semi-inoperative, and improperly configured hardware?
    • +
    +      While testing and verifying the operation +of various video boards. I discovered some cards that did not respond properly +to my programming. My initial thought was that I was doing something wrong +and tried to figure out what was wrong. However, further testing on another +identical card demonstrated that the first board had simply failed. There +is little diagnostic software for the VGA and SVGA adapters particularly +when dealing with some of the more esoteric features. This is primarily +because little has been identified about the correct behavior of video +cards. Many manufacturers fail to include a thorough diagnostics utility +with their hardware, and the diagnostics that are provided are usually +specific to one operating system. +
      +
    • +How does one properly emulate a particular VGA/SVGA adapter in order +to properly implement compatibility for legacy full-screen applications?
    • +
    +        This is a particular +are of interest to myself and others. This knowledge can be used to create +a virtual machine capable of multitasking legacy applications. Particular +features that could be provided are the ability to execute a full-screen +program in the background, execute a full-screen program in a virtual window +on a desktop, emulate a particular video adapter and translate its output +to a form compatible with the hardware on the machine, provide the ability +to remotely view an applications screen across a network, provide the ability +to debug a full-screen application without having to use a dual monitor +system or attached text terminal. Huge benefits can be reaped, but all +of the details of a particular hardware configuration must be known for +proper emulation/virtualization. For example, programs that attempt to +autodetect the hardware often rely on undocumented behaviors of video adapters. +These undocumented behaviors must be emulated properly for the application +to work properly. + +

    Notice: All trademarks used or referred to on this page are the property +of their respective owners. +
    All pages are Copyright © 1997, 1998, J. D. Neal, except where +noted. Permission for utilization and distribution is subject to the terms +of the FreeVGA Project Copyright License + + diff --git a/specs/freevga/glossary.htm b/specs/freevga/glossary.htm new file mode 100644 index 0000000..825f9d6 --- /dev/null +++ b/specs/freevga/glossary.htm @@ -0,0 +1,100 @@ + + + + + + + FreeVGA - Video Programming Glossary + + + +

    Home Back
    + +
    # | 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
    + +
    +
    Hardware Level VGA and SVGA Video Programming Information Page
    + +
    Video Programming Glossary  +
    +Introduction +
            This page is a glossary +covering video programming related terms.  It is extremely difficult +for me to determine which terms should be included in this page, thus if +you have come here looking for a particular term and are dismayed at not +finding it listed here, please send a note with the Feedback +Form including the term in the body of the message, and it will be +added here. +
    ------ C ------
    + + +

    CLUT -- see Color Look-Up Table + +

    Color Look-Up Table -- see +Palette Look-Up Table +
      +
      +

    ------ D ------
    + + +

    DAC -- acronym for Digital to Analog Converter, +which is a integrated circuit that converts intensity values to analog +signal values.  This is used in video chipsets to produce the analog +signals that are sent to the monitor.  Some DACs, known as RAMDACs +contain a palette look-up table. + +

    Digital to Analog Converter -- see DAC +

    ------ F ------
    + + +

    Frame Buffer -- RAM that is part of the graphics hardware that +stores the pixel values that are converted into color intensity. +

    ------ P ------
    + + +

    Palette Look-Up Table -- a small table of +RAM that contains a set of RGB intensity values for +each index, of which there are 256 locations.  The information in +this table is used by the DAC to generate the analog +signal. Also known as a Color Look-Up Table or CLUT. +

    ------ R ------
    + + +

    RAMDAC -- A DAC that contains a built-in palette +look-up table. + +

    RGB -- acronym for Red, Blue & Green, which +describes the three primary colors of light that a CRT generates to produce +the range of visible colors. +

    ------ S ------
    + + +

    Super VGA -- see SVGA + +

    SVGA -- acronym for Super-VGA, +which is a term applied to chipsets and the advanced functionality of those +chipsets that are above and beyond the capabilities of the original IBM +VGA chipset. +

    ------ V ------
    + + +

    VGA -- acronym for Video Graphics Array, which +is the term for IBM's successor to the EGA graphics chipset.  This +term is also used when describing register compatible functions of other +chipsets such as SVGA chipsets. + +

    Video Graphics Array -- see VGA +
      +
      + +

    Notice: All trademarks used or referred to on this page are the property +of their respective owners. +
    All pages are Copyright © 1997, 1998, J. D. Neal, except where +noted. Permission for utilization and distribution is subject to the terms +of the FreeVGA Project Copyright License. +
      +
      + + diff --git a/specs/freevga/hardovr.htm b/specs/freevga/hardovr.htm new file mode 100644 index 0000000..3dc08cd --- /dev/null +++ b/specs/freevga/hardovr.htm @@ -0,0 +1,92 @@ + + + + + + + FreeVGA - Overview of Video Hardware Functionality + + + +

    Home Introduction Frame +Buffer Graphics Controller Display +Generation Back  +
    Hardware Level VGA and SVGA Video Programming Information Page
    + +
    Overview of Video Hardware Functionality  +
    +Introduction +
            This page contains a general +overview of the functionality of VGA and SVGA cards into various sections, +and gives a description of the functions of each section.  This is +intended to be a general description for those unfamiliar to the functionality +and capabilities of graphics hardware.  The basic function of graphics +hardware is to allow the CPU to manipulate memory specific to the graphics +hardware, and to take the information stored in that memory and output +it in a form that a monitor or LCD panel can use. + +

    Frame Buffer +
            This is the component of +the video hardware that stores the pixels and information to be displayed +on the monitor.  This is the center of the video hardware, as nearly +all operations are performed on or using this data.  The frame buffer +is a form of RAM, which is typically located outside the main graphics +chip and are implemented using DRAM chips; however, more sophisticated +forms of RAM that are ideal for video hardware applications, such as VRAM.  +The amount of video memory that is present determines the maximum resolution +that the hardware can generate.  The frame buffer is usually mapped +into a region of the host CPU's address space allowing it to be accessed +as if it were a portion of the main memory.  For example, in the VGA, +this memory is mapped into the lower 1M of the CPU address space, allowing +it to be directly accessable to real mode applications, which cannot directly +access the remaining memory.  In the VGA, this memory is broken up +into 4 separate color planes, which are recombined to produce the actual +pixel values at the time of display generation. + +

    Graphics Controller +
            This is the video chipset's +host interface to the frame buffer, and is part of the main graphics chip +or chips.  It allows the host CPU to manipulate the frame buffer in +a fashion suited to the task of graphics operations.  It allows certain +methods of access that are designed to reduced the CPU requirements for +performing standard video operations, particularly in accelerated chipsets, +which can have a quite complicated set of access methods which can include +line drawing, area and pattern fill, color conversion/expansion, and even +3d rendering acceleration.  For example, in the VGA the graphics controller +allows one write by the CPU to its mapped memory region below 1M to affect +all four color planes, as well as allowing faster transfers of video data +from one region to another in video memory. + +

    Display Generation +
            This portion of the graphics +hardware is involved in taking the data in the frame buffer, converting +the pixel or character information stored by the graphics controller, and +converting it into the analog signals required by the monitor or lcd display.  +The pixel data is first sequenced, or read serially from the frame buffer, +then converted into analog color information, either by a palette look-up +table, or by directly converting into red, green, and blue components.  +The CRT controller at the same time adds timing signals that allow the +monitor to display the analog color information on the display.  For +example, in the VGA these components are made up of the sequencer, attribute +controller, CRT controller, DAC, and palette table.  The sequencer +reads the information from the frame buffer, and converts it into pixel +color information, as well as sends signals to the CRT controller such +that it can provide the timing signals the monitor requires.  This +color information is formatted by the attribute controller in such a way +that the pixel values can be submitted to the DAC.  The DAC then looks +up these values in its palette table which contains red, green, and blue +intensities for each of the colors that the attribute controller generates, +then converts it into an analog signal that is output to the VGA connector +along with the timing signals generated by the CRT controller.  If +the display is an LCD panel such as found in laptops, the DAC and associated +support hardware convert the pixel values to signals that the LCD panel +displays directly. + +

    Notice: All trademarks used or referred to on this page are the property +of their respective owners. +
    All pages are Copyright © 1997, 1998, J. D. Neal, except where +noted. Permission for utilization and distribution is subject to the terms +of the FreeVGA Project Copyright License. +
      + + diff --git a/specs/freevga/hardrec.htm b/specs/freevga/hardrec.htm new file mode 100644 index 0000000..0f865b3 --- /dev/null +++ b/specs/freevga/hardrec.htm @@ -0,0 +1,127 @@ + + + + + + + FreeVGA - Product Recommendations for Video Developers + + + +

    Home Introduction Recommended +Failed Test Back  +
    Hardware Level VGA and SVGA Video Programming Information +Page
    + +
    Product Recommendations for Video Developers  +
    +Introduction +
            This page is to provide +hardware recommendations for those implementing the information on this +site.  There are no recommendations for video cards, as the goal is +to increase programmer support for all cards, existing or otherwise, rather +than try to influence people to buy a specific video card implementation.  +I will, however recommend hardware, other than the video cards themselves +that are helpful in the development of software for video cards in general. +Monitors are a strong issue to me, both for safety concerns, and financial +concerns, as it is usually advantageous to buy an new, indestructable monitor +than to burn through many cheap, expendable monitors. + +

     Monitors Recommended +
            For a monitor to be recommended +it must meet all of the following criteria: +

      +
    • +It should be able to tolerate improperly formed video inputs for an extended +period of time without the possibility of being damaged.  It should +also be tolerant to extremely frequent mode changes.  Damage due to +this kind of operation should not be excluded by the standard manufacturer's +warranty.  This is critical due to the replacement cost of high-performance +monitors, and due to the possible safety and fire hazards failing monitors +may cause.
    • + +
    • +It should be able to synchronize to a wide variety of properly formed signals, +including both standard and custom video timings.  This important +for developing the modes required for special applications.
    • + +
    • +It should handle the maximum frequencies/resolutions that can be generated +by current and future (to a reasonable extent) video chipsets.
    • + +
    • +It should be compliant to all levels of display to host communication and +power mamagement so code can be developed that implements these features +of the video hardware.
    • + +
    • +If the monitor allows the picture controls to be saved/restored on changes +in mode, it should be allowed to defeat this feature so that the generated +video timings can be adjusted to minimize the visible effects of mode change.
    • + +
    • +It should be currently available on the market and covered by manufacturers +warranty for the period of time required to develop the desired application.
    • + +
    • +It has been put through my own personal monitor torture tests, as well +as operated for an extended period of time under conditions related to +video software development.
    • +
    +The following monitors have been evaluated by myself personally, and have +been determined to meet all these criteria. +
      +
    • +At this time, there are no monitors that I have determined meet all these +criteria.
    • +
    +Monitor Failures +
            This section lists monitors +that have either died for me while testing, or have died for others in +a fashion that would imply that the programmer was responsible for their +failure.  This does not imply that the programmer was at fault, as +these things naturally happen when developing drivers.  I strongly +recommend the purchase of one of the recommended monitors, to avoid damaging +a valuable monitor + +

    Compaq VGA (not SVGA) -- I do not know the model specifically.  +It was a fixed frequency model, and the horizontal circuitry was damaged.  +The problem was repeatable after repairs were made, so I believe that the +monitor can be damaged by normal mode testing. I have met others who claim +to have experienced this same problem.  Not recommended. + +

    CTX CMS-1561LR -- The problem with this monitor occured when +driving the monitor at the high end of its frequency envelope.  The +monitor synced to the frequency, but may have been slightly overdriven.  +The horizontal output transistor and some capacitors were replaced and +the monitor was restored to working order.  The problem has not been +repeated, so ordinary failure is likely. + +

    NCR MBR 2321 -- This one comes from a friend in Fayetteville, +AR, whose monitor blew caps while writing a svgalib video driver.  +The explosion from the capacitors shattered the rear of the picture tube, +damaging the monitor beyond repair.  Not recommended due to the catastrophic +nature of the failure.  The operation being performed when the failure +occurred was frequent mode changing. + +

    Test Equipment Recommended +
            There are certain pieces +of test equipment that can come in handy when working with video cards.  +This can be especially important when verifying that the video signal being +generated is, in fact the one intended by the programmer.  Failure +to do this can cause catastrophic failure when the driver is used in conjunction +with a fixed-frequency or other monitor that can be damaged by improper +inputs. +

      +
    • +At this time, I cannot recommend any test equipment other than a good frequency +counter, as this is really not in my area of expertise.  If you can +help me in my research into this, I would be greatly appreciative.
    • +
    +Notice: All trademarks used or referred to on this page are the property +of their respective owners. +
    All pages are Copyright © 1997, 1998, J. D. Neal, except where +noted. Permission for utilization and distribution is subject to the terms +of the FreeVGA Project Copyright License + + diff --git a/specs/freevga/home.htm b/specs/freevga/home.htm new file mode 100644 index 0000000..e27835d --- /dev/null +++ b/specs/freevga/home.htm @@ -0,0 +1,486 @@ + + + + + + + FreeVGA Project Home - Hardware level VGA and SVGA programming info + + + +
    Home News Mirrors +Preface Background VGA +SVGA Tricks Links +Disclaimer Products Feedback +Back  +
    Hardware Level VGA and SVGA Video Programming Information Page
    + +
    Home  +
    + +
     
    + +
    ' . + &t2h_anchor('', $href, $entry) . + '  ' . + $descr . + "
    ' . + $entry . + '' . $descr . + "
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    76543210
    FREE VGA
    + +
    This page is home to the FreeVGA Project +-- dedicated to providing a totally FREE source of information about video +hardware.  Additional goals/information are +located here.
    + +
    "Keep on rocking in the free world." - Neil Young
    + + +

    Latest News +
            08/01/1998 -- More +information is now up, including a large portion of the "standard" VGA +reference.  Some other minor changes have been made to other information.  +Expect more updates in the not too far future. + +

            06/20/1998 -- The +work contiues.  Added three new mirrors.  Some of the information +that was located in the VGA reference, but really applies to video programming +in general has been moved to the new Background Information (formerly Introduction) +section of this page, and has been released.  Also, a glossary has +been added defining terms related to video programming, but is not very +comprehensive at the moment, although this should improve over time. Many +minor corrections have been made to the released material after being pointed +out by the insightful people reading the information.  Thank you! + +

            06/08/1998 -- The +mirror list has been updated with the new entries. Special thanks goes +out to all those who have donated their personal resources to advance the +project's goals.  Also, the first section of *real* information is +online, the low-level programming introduction.  This section has +been relatively stable for quite some time, and seems to be releasable.  +It is my goal to release the information after it stabilizes, and has been +verified for accuracy. + +

            06/04/1998 -- If +you are looking for the current work-in-progress, and have been given the +passwords for the archive for review purposes, it can be downloaded here.  +For those with current problems/questions that this page addresses, please +feel free to use the Feedback Form to contact the +author.  If a link is marked with (WIP), it is not posted online +and at this time is available only for review, upon request, and under +specific limitations. + +

    Mirror Sites +
            At this time, the project +is experimenting with the feasibility of maintaining mirror sites to make +this information more widely available.  The following mirror sites +are provided for your convenience.  If you are interested in hosting +a mirror site of this information, please contact the author for more information. +If you are experiencing problems with any of these mirrors please use the +Feedback Form to contact the author, as it is likely +my fault that the problem has arisen. +

    +Preface +
            This page's purpose is to +provide free low-level programming information to programmers interested +in the low-level details of programming the VGA and Super VGA adapters, +in a format independent of operating environment or programming language. +This page is not intended to be a reference to graphics or game programming +algorithms but rather a reference for those people attempting to implement +such algorithms in whatever environment they are using. This page is not +intended to be a showcase of web technology and thus will use HTML features +and graphics only when it is necessary to convey information. For example, +I have left the colors and fonts set to the default, so you can actually +use the default preferences in your browser. I am continuously adding material +to this page and have tried to incorporate links to other sites with valuable +information. + +Background Information +
            Foremost, this page is meant +to be a place online where one can learn about low-level programming (If +everyone knew all of this information then this page would be redundant!) +This section contains general information that can be very helpful when +attempting to use the programming information located on this site. + +Standard VGA Chipset Reference +
            This section documents +the subset of functionality present on nearly all computers today. The +VGA BIOS utilizes only a fraction of the capability of the VGA hardware. +By programming the hardware at the lowest level, one gains the flexibility +to unleash the hardware's full potential. + +Super VGA Hardware Chipset Reference +
            This section documents the +known functionality of specific VGA/SVGA chipsets. Because developers of +chipsets and video cards face incredible competition, they have added features +and functionality far beyond the standard VGA hardware. Unfortunately to +programmers, these features have been implemented differently in each particular +chipset, and even differently between products by the same manufacturer. +It is difficult to obtaining information on these chipsets and their implementations, +particularly so if the chipset is considered "obsolete" by the manufacturer. +Because of the open-ended nature of this topic (chipsets are under constant +development) this page will be updated constantly as new information becomes +available. + +Other Video Hardware Reference +
            This section is for +video hardware that does not specifically fit into the category of VGA +or SVGA, such as MPEG hardware, video capture hardware, non-integrated +3D accelerators, virtual reality gear, digital video cameras, stereoscopic +3D goggles, TV tuner cards, non-VGA compatible video adapters and the like. +This is another open-ended topic but is not the primary focus of this page. + +

    Tricks and Techniques +
            This section contains useful +information on how to utilize the VGA/SVGA hardware to optimize specific +tasks or implement visual effects. Many of these techniques have been utilized +by game and demo programmers alike to push the envelope of the hardware's +capacity. +

    +Other References: +
            This section gives +some pointers to other available VGA hardware information available. Note +that they are listed here because +
      +
    • +Online Information
    • + +
        +
      • +The COMP.SYS.IBM.PC.HARDWARE.VIDEO +Frequently Asked Questions (FAQ) document, although not programming +oriented does contain much useful information about video hardware. The +site also includes links to nearly every vendor of video cards and monitors, +as well as links to pages covering monitor specifications. If you are looking +for video hardware related information not covered by the FreeVGA Project's +goals, you will likely find it or a link to it here.
      • + +
      • +Finn Thøgersen's VGADOC +& WHATVGA Homepage -- An excellent collection of information for +programming VGA and SVGA.
      • + +
      • +Boone's Programming +the VGA Registers -- Contains a very sketchy "Documentation Over the +I/O Registers for Standard VGA Cards" by "Shaggy of The Yellow One." It +is free and distributable over the "Feel free to spread this to whoever +wants it....." licensing agreement.
      • + +
      • +Andrew Scott's VGA Programmers Master Reference Manual (click +here to download from ftp.cdrom.com) -- A dated ('91) document that +is interesting if only because it attempts to document the VGA hardware +(actually the Trident TVGA8900 hardware) in a form useful for "writing +an applications specific BIOS." Begins with a very general description +the topic (a wordy definition of computation in general) and ends with +detailed register descriptions. Unfortunately, it lacks much material between +these areas. Worse, far from being a free resource, it requires shareware +registration fees that must be sent to the U.K. by means of a check drawn +from a U.K. bank only!
      • + +
      • +Richard Wilton's Programmer's Guide to PC and PS/2 Video Systems +(click here +to download from www.dc.ee) An older reference, covers MDA, Hercules, +CGA, MCGA, and VGA. Not much VGA material but does have some register documentation.
      • + +
      • +IBM's RS/6000 CHRP I/O Device Reference Appendix +A: VGA Programming Model -- A good VGA reference from the makers of +the IBM VGA. Better than most on-line references as it contains programming +information in addition to a register description of the hardware; however +it is still vague in many areas. Especially interesting as it begins with +an acknowledgment of the many "clones" of the VGA hardware.
      • + +
      • +Some brief VGA register info is available from the Chip +Directory, also mirrored at other sites (see Chip +Directory home page).
      • + +
      • +Eric S. Raymond's The +XFree86 Video Timings HOWTO -- explains video mode and timing information +used in configuring XFree86 to support a given monitor, intended to be +used by the end user.  Much of the information is not sepcific to +XFree86, and can be used by a programmer as an example of how a low-level +video routine can allow the end-users to setup video modes that pertain +to their monitors, as well as being useful to an end-user of such a program +attempting to configure such a routine to work with their monitors.
      • + +
      • +Tomi Engdahl's electronics +info page has some information about video and vga timings, as well +as a section on VGA to TV converters and homemade circuitry.  The +VGA +to TV converter page contans much information that pertains to driving +custom TV and monitors with a VGA or SVGA card that doesn't have the capability +built-in.
      • +
      + +
    • +Offline Information
    • + +
        +
      • +Richard F. Ferraro's Programmer's Guide to the EGA, VGA, and +Super VGA Cards, Third Edition -- A good text, one of the few good +books on a subject as broad and as complicated as low-level I/O.
      • + +
      • +Frank van Gilluwe's The Undocumented PC, Second Edition -- A Programmer's +Guide to I/O, CPUs and Fixed Memory Areas -- An excellent book, which +is the likely the most complete PC technical reference ever written, and +includes 100+ pages of video programming information, although very little +VGA register information.
      • + +
      • +Bertelsons, Rasch & Hoffman's PC Underground: Unconventional Programming +Topics -- I bought this book on markdown, due to it having some VGA information +in it.  I was surprised to find that not only did it have a register +description, but it also described some possible effects that can be done +with that register.
      • +
      + +
    • +Miscellaneous Information (Information not specific to video hardware, +but useful to video programmers.)
    • + +
        +
      • +Norman Walsh's The +comp.fonts FAQ -- An excellent resource on fonts, typefaces, and such.  +Particularly helpful is the section on intellectual property protection +for fonts, as the copyright legality of fonts and typefaces is somewhat +confusing.  Note -- Norman Walsh has ceased maintaining the FAQ, however, +this link will remain until a new version of the FAQ is produced.
      • +
      +
    +Product Recommendations +
            The FreeVGA Project does +not make hardware recommendations as pertains to hardware covered by the +documentation, in an attempt to prevent any conflicts of interest.  +However, there are other products that can be extremely helpful when implementing +the information found here, such as monitors, test equipment, and software.  +I will not refuse any request to list a product on this page, however I +will categorize it depending upon its importance and suitability for video +related software development using opinions of myself and others.  +If you disagree with the opinion here, please use the Feedback Form to +voice that opinion, such that it can be taken into account. + +Warnings and Disclaimer +
      +
    • +Danger: Monitors are designed to operate within certain frequency +ranges, or for fixed frequency monitors at certain frequencies. Driving +a monitor at a frequency that it is not designed for is not recommended +and may cause damage to the monitor's circuitry which can result in a fire +and safety risk. It is wise to know and understand the specifications +of the monitor(s) that you will be driving in order to prevent damage. +Consult the manufacturers documentation for the monitor for the information, +or if not available, contact the manufacturer directly.  If the monitor +makes unusual noises, or the internal temperature exceeds the rated temperature +of its components, the monitor is likely to experience failure.  This +failure may not be immediate, but is under most circumstances inevitable.  +Monitor failures can be violent in nature, and can explode and produce +shrapnel, as well as overheat and catch fireIn no circumstance +should one leave a monitor unattended in an uncertain state.  Furthermore, +exceeding the rated maximum frequencies of a monitor may cause the phosphors +to age prematurely, as well as increase the amount of harmful radiation +projected towards the viewer beyond the specified maximums.
    • + +
    • +Warning: Clock chips and RAMDACs as well as other components +of the video card are designed with a maximum frequency. Programming +these chips to operate at a frequency greater than they were designed for +causes the chips to run hotter than they were designed to operate, and +may cause the component to fail. It is wise to know and understand +the maximum operating frequency of the components of any video subsystem +you will be programming. Do not assume that the component is safe to operate +at a particular frequency because it can be programmed to operate at that +frequency.  The rated frequencies are rated and verified according +to batch yield.  As clock frequencies increase, the failure rate of +the chips during manufacturing testing increases.  It is impossible +to predict the actual point at which a given semiconductor will fail, thus +manufacturers monitor the failure rate statistically to determine the frequency +that gives an acceptable batch yield.  These failures are typically +unobservable and require a method of testing every gate on the chip, as +many failures may only be observable under very specific circumstances, +typically resulting in intermittent failures, although complete "meltdown" +due to a newly formed short is also possible.   If they +occur, the entire semiconductor must be rejected due to these failures +being irrepairable.  As you exceed the rated frequency you are taking +a semiconductor that has passed a thourough test at its rated frequency +and entering the realm of statistical probability.  Attempting to +find the maximum frequency is impossible, as by the time a failure is noticable +the semiconductor has already been permanently damaged.  Cooling the +external package by using a heat sink and/or fan may increase the frequency +at which a semiconductor can operate; however, there is still no way to +determine the frequency at which a specific semiconductor will fail as +it can only be done statistically and practically undetectable without +being able to determine the proper operation of every gate on the semiconductor.  +Semiconductors such as fast CPU's are rated with the required heat sink +and/or cooling fan in place.  Aftermarket cooling devices are sold +as "performance coolers" due to the inability to determine the statistical +likelyhood of failure and the inability of the end user to simply reject +failed semiconductors.  Under no circumstances should a programmer +develop software that overclocks an end-user's hardware without the end +user being warned of the statistical likelyhood of failure.  +Making any claims about the safety of the software's operation can leave +the programmer with legal liability that cannot be excluded by disclaimer.
    • + +
    • +Disclaimer: The author presents this information as-is without +any warranty, including suitability for intended purpose. The author is +not responsible for damages resulting by the use of the information, incidental +or otherwise. By utilizing this information, you as the programmer take +full liability for any damages caused by your use of this information. +If you are not satisfied with these terms, then your only recourse is to +not use this information. While every reasonable effort is made to ensure +that this information is correct, the possibility exists for error and +is not guaranteed for accuracy, and disclaims liability for any changes, +errors or omissions and is not responsible for any damages that may arise +from the use or misuse of this information.  License to use this information +is only granted where this disclaimer applies in whole.
    • +
    +Feedback +
            I can be reached online +via the Feedback Form.  Consider it your +moral obligation to send feedback about the page, including inaccuracies, +confusing parts, missing info, questions/answers and other feedback type +thingies. +
      + +

    Notice: All trademarks used or referred to on this page are the property +of their respective owners. +
    All pages are Copyright © 1997, 1998, J. D. Neal, except where +noted. Permission for utilization and distribution is subject to the terms +of the FreeVGA Project Copyright License + + diff --git a/specs/freevga/license.htm b/specs/freevga/license.htm new file mode 100644 index 0000000..3aa676d --- /dev/null +++ b/specs/freevga/license.htm @@ -0,0 +1,124 @@ + + + + + + + FreeVGA Copyright License + + + +

    Home Back  +
    Hardware Level VGA and SVGA Video Programming Information Page
    + +
    FreeVGA Project Copyright License  +
    +Introduction +
            This document contains the +FreeVGA Copyright License which states the conditions under which the FreeVGA +Project's Copyrighted information may be used and distributed.  The +conditions of this license ensure that all parties with a need for this +information have the same availability, to the maximum extent possible +as well as ensure the integrity of the documentation. + +

    Disclaimer +
            The author presents this +information as-is without any warranty, including suitability for intended +purpose. The author is not responsible for damages resulting by the use +of the information, incidental or otherwise. By utilizing this information, +you as the programmer take full liability for any damages caused by your +use of this information. If you are not satisfied with these terms, then +your only recourse is to not use this information. While every reasonable +effort is made to ensure that this information is correct, the possibility +exists for error and is not guaranteed for accuracy, and disclaims liability +for any changes, errors or omissions and is not responsible for any damages +that may arise from the use or misuse of this information.  License +to use this information is only granted where this disclaimer applies in +whole. + +

    License +
            The following copyright +license applies to all works by the FreeVGA Project. All of the FreeVGA +Project's documentation is copyrighted by its author, Joshua Neal. + +

    License to utilize the FreeVGA Project documentation is subject to the +following conditions: +

      +
    • +The copyright notice and this permission notice must be preserved complete +on all copies, complete or partial.
    • + +
    • +Duplication is permitted only for personal purposes.  Reduplication +is permitted only under the FreeVGA Project documentation's redistribution +license.
    • + +
    • +The use of the FreeVGA Project documentation to produce translations or +derivative works must be approved specifically by the author.
    • + +
    • +All warnings and disclaimers present in the complete documentation must +apply to the licensee and may not be restricted by locality.  These +must be read before use, and determined to be applicable to the licensee +before the material may be utilized.
    • + +
    • +It is forbidden to represent the FreeVGA Project or to use the FreeVGA +Project's name to solicit or obtain information, services, product, or +endorsements from another party, commercial or otherwise.
    • +
    +If all of the previous conditions are not met, then permission to utilize +the FreeVGA Project's documentation is not granted, and all rights are +reserved. + +

    License to distribute the FreeVGA Project documentation is subject to +the following conditions: +

      +
    • +The copyright notice and this permission notice must be preserved complete +on all copies, complete or partial.
    • + +
    • +An archive of the FreeVGA Project documentation may be distributed in electronic +form only in its entirety, without adding or removing any material, notices, +advertisement, or other information.  Only exact copies of archives +produced or specifically approved by the author may be distributed, and +at the time of distribution, the most recent archive must be distributed.  +The FreeVGA Project documentation must be excluded from any compilation +copyright or other restrictions.  No fee other than the cost of transmission +or the physical media containing the archive may be charged without prior +approval by the author.  The documentation may not be distributed +electronically in part, which includes mirroring in html format on the +internet, unless specific permission is granted by the author.
    • + +
    • +The FreeVGA Project documentation may be distributed in non-electronic +form to students or members of a programming team subject to the condition +that it be provided free of charge.  The documentation may not be +included with or within other copyrighted works unless the other copyrighted +works are also provided free of charge.
    • + +
    • +Small portions may be reproduced as illustrations for reviews or quotes +in other works without this permission notice if proper citation is given +(including URL if the work is online.)
    • + +
    • +Only the current documentation may be distributed.  The URL of the +FreeVGA project online documentation must be provided.  The author +reserves the right to limit distribution by any parties at any time.
    • +
    +If all of the previous conditions are not met, then permission to redistribute +the FreeVGA Project's documentation is not granted, and all distribution +rights are reserved. + +

    Notice: All trademarks used or referred to on this page are the property +of their respective owners. +
    All pages are Copyright © 1997, 1998, J. D. Neal, except where +noted. Permission for utilization and distribution is subject to the terms +of the FreeVGA Project Copyright License. +
      +
      + + diff --git a/specs/freevga/llintro.htm b/specs/freevga/llintro.htm new file mode 100644 index 0000000..7131b01 --- /dev/null +++ b/specs/freevga/llintro.htm @@ -0,0 +1,246 @@ + + + + + + + FreeVGA -- Introduction to Low-level Programming + + + +

    Home Intro Know +Why Assembly Hex +Conventions Memory Accessing +Back  +
    Hardware Level VGA and SVGA Video Programming Information +Page
    + +
    Introduction to Low-level Programming  +
    + + +

    Introduction +
            This section is intended +to give one a general background in low-level programming, specifically +related to video programming. It assumes that you already know how to program +in your intended programming environment, and answers questions such as: +

    +What do I need to know? +
            To program video +hardware at the lowest level you should have an understanding of hexadecimal +and binary numbers, how the CPU accesses memory and I/O ports, and finally +how to perform these operations in your particular programming environment. +In addition you need detailed descriptions of the particular graphics chipset +you are programming. + +

    Why write hardware-level code? +
            One reason for writing hardware-level +code is to develop drivers for operating systems or applications. Another +reason is when existing drivers do not provide the required performance +or capabilities for your application, such as for programming games or +multimedia. Finally, the most important reason is enjoyment. There is a +whole programming scene dedicated to producing "demos" of what the VGA/SVGA +can do. + +

    Do I need to know assembly language? +
            No, but it helps. Assembly +language is the basis all CPU operations. All functions of the processor +and computer are potentially accessible from assembly. With crafty use +of assembly language, one can write software that exceeds greatly the potential +of higher level languages. However, any programming environment that provides +direct access to I/O and memory will work. + +

    What are hex and binary numbers? +
            Humans use a number system +using 10 different digits (0-9), probably because that is the number of +fingers we have. Each digit represents part of a number with the rightmost +digit being ones, the second to right being tens, then hundreds, thousands +and so on. These represent the powers of 10 and is called "base 10" or +"decimal." +
            Computers are digital (and +don't usually have fingers) and use two states, either on or off to represent +numbers. The off state is represented by 0 and the on state is represented +by 1. Each digit (called a bit, short for Binary digIT) here represents +a power of 2, such as ones, twos, fours, and doubling each subsequent digit. +Thus this number system is called "base 2" or "binary." +
            Computer researchers realized +that binary numbers are unwieldy for humans to deal with; for example, +a 32-bit number would be represented in binary as 11101101010110100100010010001101. +Converting decimal to binary or vice versa requires multiplication or division, +something early computers performed very slowly, and researchers instead +created a system where the numbers were broken into groups of 3 (such as +11 101 101 010 110 100 100 010 010 001 101) and assigned a number from +0-7 based on the triplet's decimal value. This number system is called +"base 8" or "octal." +
            Computers deal with numbers +in groups of bits usually a length that is a power of 2, for example, four +bits is called a "nibble", eight bits is called a "byte", 16 bits is a +"word", and 32 bits is a "double word." These powers of two are not equally +divisible by 3, so as you see in the divided example a "double word" is +represented by 10 complete octal digits plus two-thirds of an octal digit. +It was then realized that by grouping bits into groups of four, a byte +could be accurately represented by two digits. Because a group of four +bits can represent 16 decimal numbers, they could not be represented by +simply using 0-9, so they simply created more digits, or rather re-used +the letters A-F (or a-f) to represent 10-15. So for example the rightmost +digits of our example binary number is 1101, which translates to 13 decimal +or D in this system, which is called "base 16" or "hexadecimal." +
            Computers nowadays usually +speak decimal (multiplication and division is much faster now) but when +it comes to low-level and hardware stuff, hexadecimal or binary is usually +used instead. Programming environments require you to explicitly specify +the base a number is in when overriding the default decimal. In most assembler +packages this is accomplished by appending "h" for hex and "b" for binary +to end of the number, such as 2A1Eh or 011001b. In addition, if the hex +value starts with a letter, you have to add a "0" to the beginning of the +number to allow it to distinguish it from a label or identifier, such as +0BABEh. In C and many other languages the standard is to append "0x" to +the beginning of the hex number and to append "%" to the beginning of a +binary number. Consult your programming environment's documentation for +how specifically to do this. +
            Historical Note: Another +possible explanation for the popularity of the octal system is that early +computers used 12 bit addressing instead of the 16 or 32 bit addressing +currently used by modern processors. Four octal digits conveniently covers +this range exactly, thus the historical architecture of early computers +may have been the cause for octal's popularity. + +

    What are the numerical conventions used +in this reference? +
            Decimal is used often +in this reference, as it is conventional to specify certain details about +the VGA's operation in decimal. Decimal numbers have no letter after them. +An example you might see would be a video mode described as 640x480z256. +This means that the video mode has 640 pixels across by 480 pixels down +with 256 possible simultaneous colors. Similarly an 80x25 text mode means +that the text mode has 80 characters wide (columns) by 25 characters high +(rows.) Binary is frequently used to specify fields within a particular +register and also for bitmap patterns, and has a trailing letter b (such +as 10011100b) to distinguish it from a decimal number containing only 0's +and 1's. Octal you are not likely to encounter in this reference, but if +used has a trailing letter o (such as 145o) to distinguish it from a decimal. +Hexadecimal is always used for addressing, such as when describing I/O +ports, memory offsets, or indexes. It is also often used in fields longer +than 3 bits, although in some cases it is conventional to utilize decimal +instead (for example in a hypothetical screen-width field.) +
            Note: Decimal numbers in +the range 0-1 are also binary digits, and if only a single digit is present, +the decimal and binary numbers are equivalent. Similarly, for octal the +a single digit between 0-7 is equivalent to the decimal numbers in the +same range. With hexadecimal, the single-digit numbers 0-9 are equivalent +to decimal numbers 0-9. Under these circumstances, the number is often +given as decimal where another format would be conventional, as the number +is equivalent to the decimal value. +
      + +

    How do memory and I/O ports work? +
            80x86 machines have both +a memory address space and an input/output (I/O) address space. Most of +the memory is provided as system RAM on the motherboard and most of the +I/O devices are provided by cards (although the motherboard does provide +quite a bit of I/O capability, varying on the motherboard design.) Also +some cards also provide memory. The VGA and SVGA display adapters provide +memory in the form of video memory, and they also handle I/O addresses +for controlling the display, so you must learn to deal with both. An adapter +card could perform all of its functions using solely memory or I/O (and +some do), but I/O is usually used because the decoding circuitry is simpler +and memory is used when higher performance is required. +
            The original PC design was +based upon the capabilities of the 8086/8088, which allowed for only 1 +MB of memory, of which a small range (64K) was allotted for graphics memory. +Designers of high-resolution video cards needed to put more than 64K of +memory on their video adapters to support higher resolution modes, and +used a concept called "banking" which made the 64K available to the processor +into a "window" which shows a 64K chunk of video memory at once. Later +designs used multiple banks and other techniques to simplify programming. +Since modern 32-bit processors have 4 gigabytes of address space, some +designers allow you to map all of the video memory into a "linear frame +buffer" allowing access to the entire video memory at once without having +to change the current window pointer (which can be time consuming.) while +still providing support for the windowed method. +
            Memory can be accessed most +flexibly as it can be the source and/or target of almost every machine +language instruction the CPU is capable of executing, as opposed to a very +limited set of I/O instructions. I/O space is divided into 65536 addresses +in the range 0-65535. Most I/O devices are configured to use a limited +set of addresses that cannot conflict with another device. The primary +instructions for accessing I/O are the assembly instructions "IN" and "OUT", +simply enough. Most programming environments provide similarly named instructions, +functions, or procedures for accessing these. +
            Memory can be a bit confusing +though, because the CPU has two memory addressing modes, Real mode and +Protected mode. Real mode was the only method available on the 8086 and +is still the primary addressing mode used in DOS. Unfortunately, real mode +only provides access to the first 1 MB of memory. Protected mode is used +on the 80286 and up to allow access to more memory. (There are also other +details such as protection, virtual memory, and other aspects not particularly +applicable to this discussion.) Memory is accessed by the 80x86 processors +using segments and offsets. Segments tell the memory management unit where +in memory is located, and the offset is the displacement from that address. +In real mode offsets are limited to 64K, because of the 16-bit nature of +the 8086. In protected mode, segments can be any size up to the full address +capability of the machine. Segments are accessed via special segment registers +in the processor. In real mode, the segment address is shifted left four +bits and added to the offset, allowing for a 20 bit address (20 bits = +1 MB); in protected mode segments are offsets into a table in memory which +tells where the segment is located. Your particular programming environment +may create code for real and/or protected mode, and it is important to +know which mode is being used. An added difficulty is the fact that protected +mode provides for I/O and memory protection (hence protected mode), in +order to allow multiple programs to share one processor and prevent them +from corrupting other processes. This means that you may need to interact +with the operating system to gain rights to access the hardware directly. +If you write your own protected mode handler for DOS or are using a DOS +extender, then this should be simple, but it is much more complicated under +multi-tasking operating systems such as Windows or Linux. + +

    How do I access these from my programming environment? +
            That is a very important +question, one that is very difficult to answer without knowing all of the +details of your programming environment. The documentation that accompanies +your particular development environment is best place to look for this +information, in particular the compiler, operating system, and/or the chip +specifications for the platform. + +

    Details for some common programming environments are given in: +

    +Notice: All trademarks used or referred to on this page are the property +of their respective owners. +
    All pages are Copyright © 1997, 1998, J. D. Neal, except where +noted. Permission for utilization and distribution is subject to the terms +of the FreeVGA Project Copyright License. + + diff --git a/specs/freevga/vga/256left.gif b/specs/freevga/vga/256left.gif new file mode 100644 index 0000000000000000000000000000000000000000..9098b84e7916bf45cab1f1b3ca3117315c676202 GIT binary patch literal 3395 zcmV-J4ZQM4Nk%v~VR!)m0q_6-00030|Nkri0001Z0RRC20{@JUsmtvTqnxzbi?iOm z`wxcVNS5Y_rs~SJ?hD8AOxN~}=lag~{tpZahs2`sh)gP%%%<}RjY_A~s`ZM^YL|d6 z0O9q5!;kPc(&d=PjI@D#PKd|xi5qRM2kyBvUjp~0w`GxcU?{k@koVU%SiyMsxOWz* zFef?b(AdCu$4TP`+KEU>h=D2k_&LdkNvh$h3c%os(Ndj==kjzS1qkOoNHXp-Ay_z9)E4UYN_q% zy?(D0zI^+3eX}$$niziUveDZ$hh4gNg%nOh=&jy4asLs?sbd!G*F84cIC?aPG8mhT zB2RW)2XkXbgA-Spe29#qx^xRqW<=LbM-p^w@4AGd}zs&MUydM!iDqVeQ49>-@Zh=xw78-Z~rkr0)LQfO& zVT2M+NMVH*UWj3a8g6JH9UFcKVu&J+NMea53e;hWDz3<4i!QzhV~jG+NMnsQ-iTw4 zI_}70k3RkgWROA*No0{m9*JaUMipuM^$~L;}yxRh@F0r+08f&?P{#&mdbHe*9 z!0;CP0l5hm95BAf(pzn+{VGgxvhvOvCb(8T%&@gpdK?tS8~aJ}K_;^+FvOy)eComZ zE;Q`9dX+$~IT=5Ca>Me{jIPZda>?()K-&r?qEIf)bkj~h4RzE~Pfc~zR$q;E)>?1P zb=O{h4R+XKj~yhH3!hDP+N5^iZQ4=qBdRosZZwWxxWKijaGsfaEqu$hx5`e(<@?@8 zf8We<-*hvo_;KMlPI%#sbG$et(f_)~k-ptoY$`9XTt0AY`r50k=ZA$}y69`4ygKE) zjo!KH_oChUtAW?N9O%Tr2Ro;J%+9&%!q2TP;d1*MvGCct(@L3!4nKSIzA}II@u(LM zJj0NZZm#vI?~eT1-oswBw&pwkdE}J0o_Kst4L{2B-}mhPQ}E{uJo|hL%|G#wp}oHB zmG5}Jiyc5V$GzAYPkW5h-t(x3yahtfb+@}70QHA12<|U{49uSZK?Xny>JAmPuwJc7 z$fpr@FKHfB9|j%x!J%O8E(*QLHuF}Q34(LO^%9aT%#BNX1~3i z5pQ$UhZ-yAwmj-_k3Kq4Py9Hv65&Tgfh5r&LsZBS9TG(1A!8$91x7YDFOoE57bSx@ zy*X;Kk~*B^CZQO#PHOU!$~z+)3z5VGa#E6|WMV5Z=}J$=@{_L=Ww1zzOIFVEmbBC* z5DECQ_-yYr_sZogjR{JT)smISv?VN)naN#3bCuK_Q!{;8kHT0=W16Fw39$*z?Mc&_ z%dDpV$cfEs#!#KlEN45>H_mXfOnk}eROc?D#a^ycpY3F4Dg6mXfJSqg1a+rD$7fDb zGLD|~f)@M6Cs1C-lmC+uRYpa-$IpLeG@u(DC_2r#(9|_Fq+Gn?JNG%!es)x%1x@El zE&5W7rc|RdRcQ3yGt!&(&7=qQs61)qpax47Yju6BVKg7i?Y#GkClKMnx4X%+aK#R>2MiUv@bx;0Pa=rx!JF2Z7k&6gQW?CGPKv zhk8;9|J0@=ma&KZTjL+c_`wnuu_Y%w!Ow2EzCJdwhBFM>9fG)eNJf)vQ4HlFcX-Qe z+meyV>Ea}lBsWaXGM1zKWHh(csrmiTfU4VN8aLU-X^u0J;B4nJFPY0`E;Equ`{F(a zd8~Dw@&8ui3urMLy3j;EG^6v3VLmr{3Rcakko7F+JB+0S-0p`m?iYo8X`qpULcXiMsBJDbkf2JDoN>FtUDm(`^n_p7zdgG#fR z7|LySxvS0YS|9ql*Vgi|!@cZ1iW8x;G5@kljhA7v#2d$Z`E1?vmQ&sDKiE6quTJ<~ zA70=7mYTc)$@r2Ze(6v0xYT{!bM+>C?K-dfpFccvm|i~Aiw}I;m&9|QtGvR0@4MY8 zU-=52TlCx>G0@r0dDAZ~^*uE^-A^y}ulKR`(Dc1o8}IqeS0414H)`lLpR(YN8u&)C zJn`3L{Ijpy^(Ie#k{%CLdgEF5-oJg~3qN<|3*YwVk9O%NkNfs}C((wNf5)ePcmKav zyyC}yfB)srd(D)6L??Lc$5nB3eNmTyNoRnt=YR(&WzVO8vj=^H7ks&wN3xc30|<8c zM}CeLfz5YdqX&N;Sb}`?E~|HR3pjNR7=JI=RRKs#94IUGSAbk2gX2VlW0rpEXMzZ~ ze{YuyguRZAgNVXM}o)L?pO_9e9DD zk_uq;Rd7@+2V?{&Cx~v?buH+JlLbi(c!#Xxd=Rs1b4Y=iXoq;{6=e2+q5nX7!$d31 zp)<769*ZL;!IXkrfQ3RRcfyruBs6Jg=S`YpP2vk7*=iLCf`I--?TaeGf)I1iE&tqw#ayKBU0jIjU&iS;-ZXR2Z$ATT99;z z`GFb*6cN$WDv+a#v@#<>2zgB{AP0~ExowcBOksAA2uX?v z*oovAk=rO=4!Kr~xPkvjfEIa?`P7G>$a)*ek-jjH6B$YciH5*9lKe=J64a9LfH^C< ziTP-895RbC*)_t5le@Q*J?WD_36wRdAwroULD>Ya$cHa!l%4jG*#D=IOR0ED>4_?6 ziBM^7Qpt-Z*^O37TuG^wT$u!0B!auxlwcW^Wto*Ixs_(wd0wfOYzYP6XCiP(mvw2E zdbpN%Ss;0-m;J$)eVKKD=_G$CnDJ7WRCt((nV9HRF^f4Qy+xRgc?GX1nLnbFl_?{U ziJ6oVjmwGcdXh$~%#F}0OI;v5RJvf^}05{YK zTtJhOxj96&8ID*4oK$d*yg81dSe%9!6UZ5xb-0|-DV@_voz-cb*NL5GNtqH!h}r3W z+Sh`b>79#qH}&)~N;95aG(W^cjoO%=$Hqmv;yd*8p1~QP;37Ch^{JlsnH2Scj`|sE Zl9NH_xqSd?pa+Ve396t*SpWq906WGtrw;%C literal 0 HcmV?d00001 diff --git a/specs/freevga/vga/256left.txt b/specs/freevga/vga/256left.txt new file mode 100644 index 0000000..3a7630a --- /dev/null +++ b/specs/freevga/vga/256left.txt @@ -0,0 +1,20 @@ + 256-Color Shift Mode Diagram (Left) + ----------------------------------- + + Plane 0 Plane 1 Plane 2 Plane 3 + Carried 7654 3210 7654 3210 7654 3210 7654 3210 +From Prev 0000 1111 0000 1111 0000 1111 0000 1111 + | | | | | | | | | + | | | | | | | | | + XXXX 0000 | | | | | | | + 0 0000 1111 | | | | | | + 1 1111 0000 | | | | | + 2 0000 1111 | | | | + 3 1111 0000 | | | + 4 0000 1111 | | + 5 1111 0000 | +<----- Direction of Shift 6 0000 1111 + 7 | + v + Carried + To Next diff --git a/specs/freevga/vga/256right.gif b/specs/freevga/vga/256right.gif new file mode 100644 index 0000000000000000000000000000000000000000..11721f68c018e2dc04bf38945de270500b28761a GIT binary patch literal 3408 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 literal 0 HcmV?d00001 diff --git a/specs/freevga/vga/256right.txt b/specs/freevga/vga/256right.txt new file mode 100644 index 0000000..f213bfe --- /dev/null +++ b/specs/freevga/vga/256right.txt @@ -0,0 +1,18 @@ + 256-Color Shift Mode Diagram (Right) + ----------------------------------- + + Plane 3 Plane 2 Plane 1 Plane 0 + 7654 3210 7654 3210 7654 3210 7654 3210 Carried + 0000 1111 0000 1111 0000 1111 0000 1111 From Prev + | | | | | | | | | + | | | | | | | 1111 XXXX + | | | | | | 0000 1111 0 + | | | | | 1111 0000 1 + | | | | 0000 1111 2 + | | | 1111 0000 3 + | | 0000 1111 4 + | 1111 0000 5 + 0000 1111 6 + | 7 + Carried + To Next diff --git a/specs/freevga/vga/attrreg.htm b/specs/freevga/vga/attrreg.htm new file mode 100644 index 0000000..e1ed97b --- /dev/null +++ b/specs/freevga/vga/attrreg.htm @@ -0,0 +1,360 @@ + + + + + + + VGA/SVGA Video Programming--Attribute Controller Registers + + + +
    Home Back  +
    Hardware Level VGA and SVGA Video Programming Information +Page
    + +
    Attribute Controller Registers  +
    + + +

            The Attribute Controller +Registers are accessed via a pair of registers, the Attribute Address/Data +Register and the Attribute Data Read Register. See the Accessing +the VGA Registers section for more detals. The Address/Data Register +is located at port 3C0h and the Data Read Register is located at port 3C1h. +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Address Register(3C0h)
    76543210
    PASAttribute Address
    +  +

      PAS -- Palette Address Source
      +
      "This bit is set to 0 to load color values to the registers in the +internal palette. It is set to 1 for normal operation of the attribute +controller. Note: Do not access the internal palette while this bit is +set to 1. While this bit is 1, the Type 1 video subsystem disables accesses +to the palette; however, the Type 2 does not, and the actual color value +addressed cannot be ensured." +
    • +Attribute Address
      +
      This field specifies the index value of the attribute register to be +read or written.
    • +
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Palette Registers (Index 00-0Fh)
    76543210
    Internal Palette Index
    +  +
      Internal Palette Index
      +
      "These 6-bit registers allow a dynamic mapping between the text +attribute or graphic color input value and the display color on the CRT +screen. When set to 1, this bit selects the appropriate color. The Internal +Palette registers should be modified only during the vertical retrace interval +to avoid problems with the displayed image. These internal palette values +are sent off-chip to the video DAC, where they serve as addresses into +the DAC registers."
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Mode Control Register +(Index 10h)
    76543210
    P54S8BITPPMBLINKLGEMONOATGE
    +  +
      P54S -- Palette Bits 5-4 Select
      +
      "This bit selects the source for the P5 and P4 video bits that act +as inputs to the video DAC. When this bit is set to 0, P5 and P4 are the +outputs of the Internal Palette registers. When this bit is set to 1, P5 +and P4 are bits 1 and 0 of the Color Select register." +
      8BIT -- 8-bit Color Enable
      +
      "When this bit is set to 1, the video data is sampled so that eight +bits are available to select a color in the 256-color mode (0x13). This +bit is set to 0 in all other modes." +
    • +PPM -- Pixel Panning Mode
    • + +
      This field allows the upper half of the screen to pan independently +of the lower screen. If this field is set to 0 then nothing special occurs +during a successful line compare (see the Line +Compare field.) If this field is set to 1, then upon a successful line +compare, the bottom portion of the screen is displayed as if the Pixel +Shift Count and Byte Panning fields are +set to 0. +
      BLINK - Blink Enable
      +
      "When this bit is set to 0, the most-significant bit of the attribute +selects the background intensity (allows 16 colors for background). When +set to 1, this bit enables blinking." +
    • +LGA - Line Graphics Enable
    • + +
      This field is used in 9 bit wide character modes to provide continuity +for the horizontal line characters in the range C0h-DFh. If this field +is set to 0, then the 9th column of these characters is replicated from +the 8th column of the character. Otherwise, if it is set to 1 then the +9th column is set to the background like the rest of the characters. +
    • +MONO - Monochrome Emulation
    • + +
      This field is used to store your favorite bit. According to IBM, "When +this bit is set to 1, monochrome emulation mode is selected. When this +bit is set to 0, color |emulation mode is selected." It is present and +programmable in all of the hardware but it apparently does nothing. The +internal palette is used to provide monochrome emulation instead. +
    • +ATGE - Attribute Controller Graphics Enable
      +
      "When set to 1, this bit selects the graphics mode of operation."
    • +
    +  + + + + + + + + + + + + + + + + + + + + + + + + +
    Overscan Color Register (Index 11h)
    76543210
    Overscan Palette Index
    +  +
      Overscan Palette Index
      +
      "These bits select the border color used in the 80-column alphanumeric +modes and in the graphics modes other than modes 4, 5, and D. (Selects +a color from one of the DAC registers.)"
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Color Plane Enable Register (Index +12h)
    76543210
    Color Plane Enable
    +  +
      +
    • +Color Plane Enable
      +
      "Setting a bit to 1, enables the corresponding display-memory color +plane."
    • +
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Horizontal Pixel Panning Register +(Index 13h)
    76543210
    Pixel Shift Count
    +  +
      Pixel Shift Count
      +
      "These bits select the number of pels that the video data is shifted +to the left. PEL panning is available in both alphanumeric and graphics +modes."
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Color Select Register (Index 14h)
    76543210
    Color Select 7-6Color Select 5-4
    +  +
      Color Select 7-6
      +
      "In modes other than mode 13 hex, these are the two most-significant +bits of the 8-bit digital color value to the video DAC. In mode 13 hex, +the 8-bit attribute is the digital color value to the video DAC. These +bits are used to rapidly switch between sets of colors in the video DAC." +
      Color Select 5-4
      +
      "These bits can be used in place of the P4 and P5 bits from the +Internal Palette registers to form the  8-bit digital color value +to the video DAC. Selecting these bits is done in the Attribute Mode Control  +register (index 0x10). These bits are used to rapidly switch between colors +sets within the video DAC."
    +Notice: All trademarks used or referred to on this page are the property +of their respective owners. +
    All pages are Copyright © 1997, 1998, J. D. Neal, except where +noted. Permission for utilization and distribution is subject to the terms +of the FreeVGA Project Copyright License. + + diff --git a/specs/freevga/vga/char.txt b/specs/freevga/vga/char.txt new file mode 100644 index 0000000..b255efb --- /dev/null +++ b/specs/freevga/vga/char.txt @@ -0,0 +1,22 @@ +_____Examples_of_Text_Mode_Bitmap_Characters_____ + + 7 8x8 0 ___Legend___ 7 8x16 0 7 9x16 0 + 0--XX---- - Background 0-------- 0-------- + -XXXX--- X Foreground -------- -------- + XX--XX-- ? Undisplayed ---X---- XX----XX + XX--XX-- --XXX--- XXX--XXX + XXXXXX-- -XX-XX-- XXXXXXXX + XX--XX-- XX---XX- XXXXXXXX + XX--XX-- XX---XX- XX-XX-XX + 7-------- <------+ XXXXXXX- XX----XX + 8???????? | XX---XX- XX----XX + ???????? XX---XX- XX----XX + ???????? Maximum Scan XX---XX- XX----XX + ???????? Line XX---XX- XX----XX + ???????? -------- -------- + ???????? | -------- -------- + ???????? | -------- -------- + ???????? +------> 15-------- 15-------- + ???????? 16???????? 16???????? + ... ... ... +31???????? 31???????? 31???????? diff --git a/specs/freevga/vga/colorreg.htm b/specs/freevga/vga/colorreg.htm new file mode 100644 index 0000000..c57fdf2 --- /dev/null +++ b/specs/freevga/vga/colorreg.htm @@ -0,0 +1,253 @@ + + + + + + + VGA/SVGA Video Programming--Color Regsters + + + +
      +
      Home Back  +
      Hardware Level VGA and SVGA Video Programming Information +Page
      + +
      Color Registers
      + +
      +
      +
    +        The Color Registers in the standard +VGA provide a mapping between the palette of between 2 and 256 colors to +a larger 18-bit color space. This capability allows for efficient use of +video memory while providing greater flexibility in color choice. The standard +VGA has 256 palette entries containing six bits each of red, green, and +blue values. The palette RAM is accessed via a pair of address registers +and a data register. To write a palette entry, output the palette entry's +index value to the DAC Address Write Mode Register then +perform 3 writes to the DAC Data Register, loading the +red, green, then blue values into the palette RAM. The internal write address +automatically advances allowing the next value's RGB values to be loaded +without having to reprogram the DAC Address Write Mode Register.  +This allows the entire palette to be loaded in one write operation. +To read a palette entry, output the palette entry's index to the DAC +Address Read Mode Register. Then perform 3 reads from the DAC +Data Register, loading the red, green, then blue values from palette +RAM. The internal write address automatically advances allowing the next +RGB values to be written without having to reprogram the DAC +Address Read Mode Register. + +

    Note: I have noticed some great variance in the actual +behavior of these registers on VGA chipsets. The best way to ensure compatibility +with the widest range of cards is to start an operation by writing to the +appropriate address register and performing reads and writes in groups +of 3 color values. While the automatic increment works fine on all cards +tested, reading back the value from the DAC Address Write +Mode Register may not always produce the expected result. Also interleaving +reads and writes to the DAC Data Register without first +writing to the respected address register may produce unexpected results. +In addition, writing values in anything other than groups of 3 to the DAC +Data Register and then performing reads may produce unexpected results. +I have found that some cards fail to perform the desired update until the +third value is written. +

    +  + + + + + + + + + + + + + + + + + + + + + + + + +
    DAC Address Write Mode Register +(Read/Write at 3C8h)
    76543210
    DAC Write Address
    +  +
      +
    • +DAC Write Address
    • + +
      Writing to this register prepares the DAC hardware to accept writes +of data to the DAC Data Register. The value written +is the index of the first DAC entry to be written (multiple DAC entries +may be written without having to reset the write address due to the auto-increment.) +Reading this register returns the current index, or at least theoretically +it should. However it is likely the value returned is not the one expected, +and is dependent on the particular DAC implementation. (See note +above)
    +  + + + + + + + + + + + + + + + + + + + + + + + + +
    DAC Address Read Mode Register +(Write at 3C7h)
    76543210
    DAC Read Address
    +  +
      +
    • +DAC Read Address
    • + +
      Writing to this register prepares the DAC hardware to accept reads +of data to the DAC Data Register. The value written +is the index of the first DAC entry to be read (multiple DAC entries may +be read without having to reset the write address due to the auto-increment.)
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DAC Data Register (Read/Write at +3C9h)
    76543210
    DAC Data
    +  +
      +
    • +DAC Data
    • + +
      Reading or writing to this register returns a value from the DAC memory. +Three successive I/O operations accesses three intensity values, first +the red, then green, then blue intensity values. The index of the DAC entry +accessed is initially specified by the DAC Address Read +Mode Register or the DAC Address Write Mode Register, +depending on the I/O operation performed. After three I/O operations the +index automatically increments to allow the next DAC entry to be read without +having to reload the index. I/O operations to this port should always be +performed in sets of three, otherwise the results are dependent on the +DAC implementation. (See note above)
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DAC State Register (Read at 3C7h)
    76543210
    DAC State
    +  +
      +
    • +DAC State
    • + +
      This field returns whether the DAC is prepared to accept reads or writes +to the DAC Data Register. In practice, this field is +seldom used due to the DAC state being known after the index has been written. +This field can have the following values: + +
    + + +

    Notice: All trademarks used or referred to on this page are the property +of their respective owners. +
    All pages are Copyright © 1997, 1998, J. D. Neal, except where +noted. Permission for utilization and distribution is subject to the terms +of the FreeVGA Project Copyright License. + + diff --git a/specs/freevga/vga/crtcreg.htm b/specs/freevga/vga/crtcreg.htm new file mode 100644 index 0000000..db4aa6a --- /dev/null +++ b/specs/freevga/vga/crtcreg.htm @@ -0,0 +1,1355 @@ + + + + + + + VGA/SVGA Video Programming--CRT Controller Registers + + + +

    Home Back  +
    Hardware Level VGA and SVGA Video Programming Information +Page
    + +
    CRT Controller Registers  +
    + + +

            The CRT Controller (CRTC) +Registers are accessed via a pair of registers, the CRTC Address Register +and the CRTC Data Register. See the Accessing the +VGA Registers section for more details. The Address Register is located +at port 3x4h and the Data Register is located at port 3x5h.  The value +of the x in 3x4h and 3x5h is dependent on the state of the Input/Output +Address Select field, which allows these registers to be mapped at +3B4h-3B5h or 3D4h-3D5h.   Note that when the CRTC +Registers Protect Enable field is set to 1, writing to register indexes +00h-07h is prevented, with the exception of the Line Compare +field of the Overflow Register. +

    +  + + + + + + + + + + + + + + + + + + + + + + + + +
    Horizontal Total Register (Index +00h)
    76543210
    Horizontal Total
    +  +
      +
    • +Horizontal Total
    • + +
      This field is used to specify the number of character clocks per scan +line.  This field, along with the dot rate selected, controls the +horizontal refresh rate of the VGA by specifying the amount of time one +scan line takes.  This field is not programmed with the actual number +of character clocks, however.  Due to timing factors of the VGA hardware +(which, for compatibility purposes has been emulated by VGA compatible  +chipsets), the actual horizontal total is 5 character clocks more than +the value stored in this field, thus one needs to subtract 5 from the actual +horizontal total value desired before programming it into this register.
    +  + + + + + + + + + + + + + + + + + + + + + + + + +
    End Horizontal Display Register +(Index 01h)
    76543210
    End Horizontal Display
    +  +
      +
    • +End Horizontal Display
    • + +
      This field is used to control the point that the sequencer stops outputting +pixel values from display memory, and sequences the pixel value specified +by the Overscan Palette Index field for the +remainder of the scan line.  The overscan begins the character clock +after the the value programmed into this field.  This register should +be programmed with the number of character clocks in the active display +- 1.  Note that the active display may be affected by the Display +Enable Skew field. +
       
    +  + + + + + + + + + + + + + + + + + + + + + + + + +
    Start Horizontal Blanking Register +(Index 02h)
    76543210
    Start Horizontal Blanking
    +  +
      +
    • +Start Horizontal Blanking
    • + +
      This field is used to specify the character clock at which the horizontal +blanking period begins.  During the horizontal blanking period, the +VGA hardware forces the DAC into a blanking state, where all of the intensities +output are at minimum value, no matter what color information the attribute +controller is sending to the DAC.  This field works in conjunction +with the End Horizontal Blanking field to specify the +horizontal blanking period.  Note that the horizontal blanking can +be programmed to appear anywhere within the scan line, as well as being +programmed to a value greater than the Horizontal +Total field preventing the horizontal blanking from occurring at all.
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    End Horizontal Blanking Register +(Index 03h)
    76543210
    EVRADisplay Enable SkewEnd Horizontal Blanking
    +  +
      +
    • +EVRA -- Enable Vertical Retrace Access
    • + +
      This field was used in the IBM EGA to provide access to the light pen +input values as the light pen registers were mapped over CRTC indexes 10h-11h.  +The VGA lacks capability for light pen input, thus this field is normally +forced to 1 (although always writing it as 1 might be a good idea for compatibility) +, which in the EGA would enable access to the vertical retrace fields instead +of the light pen fields. +
    • +Display Enable Skew
    • + +
      This field affects the timings of the display enable circuitry in the +VGA. The value of this field is the number of character clocks that the +display enable "signal" is delayed.  In all the VGA/SVGA chipsets +I've tested, including a PS/2 VGA this field is always programmed to 0.  +Programming it to non-zero values results in the overscan being displayed +over the number of characters programmed into this field at the beginning +of the scan line, as well as the end of the active display being shifted +the number of characters programmed into this field.  The characters +that extend past the normal end of the active display can be garbled in +certain circumstances that is dependent on the particular VGA implementation.  +According to documentation from IBM, "This skew control is needed to +provide sufficient time for the CRT controller to read a character and +attribute code from the video buffer, to gain access to the character generator, +and go through the Horizontal PEL Panning register in the attribute controller. +Each access requires the 'display enable' signal to be skewed one character +clock so that the video output is synchronized with the horizontal and +vertical retrace signals." as well as "Note: Character skew is not +adjustable on the Type 2 video and the bits are ignored; however, programs +should set these bits for the appropriate skew to maintain compatibility."  +This may be required for some early IBM VGA implementations or may be simply +an unused "feature" carried over along with its register description from +the IBM EGA implementations that require the use of this field. +
    • +End Horizontal Blanking
    • + +
      This contains bits 4-0 of the End Horizontal Blanking field which specifies +the end of the horizontal blanking period.  Bit 5 is located After +the period has begun as specified by the Start Horizontal +Blanking field, the 6-bit value of this field is compared against the +lower 6 bits of the character clock.  When a match occurs, the horizontal +blanking signal is disabled.  This provides from 1 to 64 character +clocks although some implementations may match in the character clock specified +by the Start Horizontal Blanking field, in which case +the range is 0 to 63.  Note that if blanking extends past the end +of the scan line, it will end on the first match of this field on the next +scan line.
    +  + + + + + + + + + + + + + + + + + + + + + + + + +
    Start Horizontal Retrace Register +(Index 04h)
    76543210
    Start Horizontal Retrace
    +  +
      +
    • +Start Horizontal Retrace
    • + +
      This field specifies the character clock at which the VGA begins sending +the horizontal synchronization pulse to the display which signals the monitor +to retrace back to the left side of the screen.  The end of this pulse +is controlled by the End Horizontal Retrace field.  +This pulse may appear anywhere in the scan line, as well as set to a position +beyond the Horizontal Total field which effectively +disables the horizontal synchronization pulse.
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    End Horizontal Retrace Register +(Index 05h)
    76543210
    EHB5Horiz. Retrace SkewEnd Horizontal Retrace
    +  +
      +
    • +EHB5 -- End Horizontal Blanking (bit 5)
    • + +
      This contains bit 5 of the End Horizontal Blanking field.  See +the End Horizontal Blanking Register for details. +
    • +Horiz. Retrace Skew -- Horizontal Retrace Skew
    • + +
      This field delays the start of the horizontal retrace period by the +number of character clocks equal to the value of this field.  From +observation, this field is programmed to 0, with the exception of the 40 +column text modes where this field is set to 1.  The VGA hardware +simply acts as if this value is added to the Start Horizontal +Retrace field.  According to IBM documentation, "For certain +modes, the 'horizontal retrace' signal takes up the entire blanking interval. +Some internal timings are generated by the falling edge of the 'horizontal +retrace' signal. To ensure that the signals are latched properly, the 'retrace' +signal is started before the end of the 'display enable' signal and then +skewed several character clock times to provide the proper screen centering."  +This does not appear to be the case, leading me to believe this is yet +another holdout from the IBM EGA implementations that do require the use +of this field. +
    • +End Horizontal Retrace
    • + +
      This field specifies the end of the horizontal retrace period, which +begins at the character clock specified in the Start Horizontal +Retrace field.  The horizontal retrace signal is enabled until +the lower 5 bits of the character counter match the 5 bits of this field.  +This provides for a horizontal retrace period from 1 to 32 character clocks.  +Note that some implementations may match immediately instead of 32 clocks +away, making the effective range 0 to 31 character clocks.
    +  + + + + + + + + + + + + + + + + + + + + + + + + +
    Vertical Total Register (Index 06h)
    76543210
    Vertical Total
    +  +
      Vertical Total +
      This contains the lower 8 bits of the Vertical Total field.  Bits +9-8 of this field are located in the Overflow Register. +This field determines the number of scanlines in the active display and +thus the length of each vertical retrace.  This field contains the +value of the scanline counter at the beginning of the last scanline in +the vertical period.
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Overflow Register (Index 07h)
    76543210
    VRS9VDE9VT9LC8SVB8VRS8VDE8VT8
    +  +
      +
    • +VRS9 -- Vertical Retrace Start (bit 9)
    • + +
      Specifies bit 9 of the Vertical Retrace Start field.  See the +Vertical Retrace Start Register for details. +
    • +VDE9 -- Vertical Display End (bit9)
    • + +
      Specifies bit 9 of the Vertical Display End field.  See the Vertical +Display End Register for details. +
    • +VT9 -- Vertical Total (bit 9)
    • + +
      Specifies bit 9 of the Vertical Total field.  See the Vertical +Total Register for details. +
    • +LC8 -- Line Compare (bit 8)
    • + +
      Specifies bit 8 of the Line Compare field. See the Line +Compare Register for details. +
    • +SVB8 -- Start Vertical Blanking (bit 8)
    • + +
      Specifies bit 8 of the Start Vertical Blanking field.  See the +Start Vertical Blanking Register for details. +
    • +VRS8 -- Vertical Retrace Start (bit 8)
    • + +
      Specifies bit 8 of the Vertical Retrace Start field.  See the +Vertical Retrace Start Register for details. +
    • +VDE8 -- Vertical Display End (bit 8)
    • + +
      Specifies bit 8 of the Vertical Display End field.  See the Vertical +Display End Register for details. +
    • +VT8 -- Vertical Total (bit 8)
    • + +
      Specifies bit 8 of the Vertical Total field.  See the Vertical +Total Register for details.
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Preset Row Scan Register (Index +08h)
    76543210
    Byte PanningPreset Row Scan
    +  +
      +
    • +Byte Panning
    • + +
      The value of this field is added to the Start +Address Register when calculating the display memory address for the +upper left hand pixel or character of the screen. This allows for a maximum +shift of 15, 31, or 35 pixels without having to reprogram the Start +Address Register. +
    • +Preset Row Scan
    • + +
      This field is used when using text mode or any mode with a non-zero +Maximum Scan Line field to provide for more +precise vertical scrolling than the Start Address +Register provides. The value of this field specifies how many scan +lines to scroll the display upwards. Valid values range from 0 to the value +of the Maximum Scan Line field. Invalid values +may cause undesired effects and seem to be dependent upon the particular +VGA implementation.
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Maximum Scan Line Register (Index +09h)
    76543210
    SDLC9SVB9Maximum Scan Line
    +  +
      SD -- Scan Doubling
      +
      "When this bit is set to 1, 200-scan-line video data is converted +to 400-scan-line output. To do this, the clock in the row scan counter +is divided by 2, which allows the 200-line modes to be displayed as 400 +lines on the display (this is called double scanning; each line is displayed +twice). When this bit is set to 0, the clock to the row scan counter is +equal to the horizontal scan rate." +
    • +LC9 -- Line Compare (bit 9)
    • + +
      Specifies bit 9 of the Line Compare field. See the Line +Compare Register for details. +
    • +SVB9 -- Start Vertical Blanking (bit 9)
    • + +
      Specifies bit 9 of the Start Vertical Blanking field.  See the +Start Vertical Blanking Register for details. +
    • +Maximum Scan Line
    • + +
      In text modes, this field is programmed with the character height - +1 (scan line numbers are zero based.) In graphics modes, a non-zero value +in this field will cause each scan line to be repeated by the value of +this field + 1.
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Cursor Start Register (Index 0Ah)
    76543210
    CDCursor Scan Line Start
    +  +
      +
    • +CD -- Cursor Disable
    • + +
      This field controls whether or not the text-mode cursor is displayed. +Values are: +
        +
      • +0 -- Cursor Enabled
      • + +
      • +1 -- Cursor Disabled
      • +
      + +
    • +Cursor Scan Line Start
    • + +
      This field controls the appearance of the text-mode cursor by specifying +the scan line location within a character cell at which the cursor should +begin, with the top-most scan line in a character cell being 0 and the +bottom being with the value of the Maximum Scan Line +field.
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     Cursor End Register (Index +0Bh)
    76543210
    Cursor SkewCursor Scan Line End
    +  +
      +
    • +CSK -- Cursor Skew
    • + +
      This field was necessary in the EGA to synchronize the cursor with +internal timing. In the VGA it basically is added to the cursor location. +In some cases when this value is non-zero and the cursor is near the left +or right edge of the screen, the cursor will not appear at all, or a second +cursor above and to the left of the actual one may appear. This behavior +may not be the same on all VGA compatible adapter cards. +
    • +Cursor Scan Line End
    • + +
      This field controls the appearance of the text-mode cursor by specifying +the scan line location within a character cell at which the cursor should +end, with the top-most scan line in a character cell being 0 and the bottom +being with the value of the Maximum Scan Line field. +If this field is less than the Cursor Scan Line Start +field, the cursor is not drawn. Some graphics adapters, such as the IBM +EGA display a split-block cursor instead.
    +  + + + + + + + + + + + + + + + + + + + + + + + + +
    Start Address High Register (Index +0Ch)
    76543210
    Start Address High
    +  +
      +
    • +Start Address High
    • + +
      This contains specifies bits 15-8 of the Start Address field. See the +Start Address Low Register for details.
    +  + + + + + + + + + + + + + + + + + + + + + + + + +
    Start Address Low Register (Index +0Dh)
    76543210
    Start Address Low
    +  +
      +
    • +Start Address Low
    • + +
      This contains the bits 7-0 of the Start Address field. The upper 8 +bits are specified by the Start Address High Register. +The Start Address field specifies the display memory address of the upper +left pixel or character of the screen. Because the standard VGA has a maximum +of 256K of memory, and memory is accessed 32 bits at a time, this 16-bit +field is sufficient to allow the screen to start at any memory address. +Normally this field is programmed to 0h, except when using virtual resolutions, +paging, and/or split-screen operation. Note that the VGA display will wrap +around in display memory if the starting address is too high. (This may +or may not be desirable, depending on your intentions.)
    +  + + + + + + + + + + + + + + + + + + + + + + + + +
    Cursor Location High Register (Index 0Eh)
    76543210
    Cursor Location High
    +  + +  + + + + + + + + + + + + + + + + + + + + + + + + +
    Cursor Location Low Register (Index +0Fh)
    76543210
    Cursor Location Low
    +  +
      +
    • +Cursor Location Low
    • + +
      This field specifies bits 7-0 of the Cursor Location field. When the +VGA hardware is displaying text mode and the text-mode cursor is enabled, +the hardware compares the address of the character currently being displayed +with sum of value of this field and the sum of the Cursor +Skew field. If the values equal then the scan lines in that character +specified by the Cursor Scan Line Start field and the +Cursor Scan Line End field are replaced with the foreground +color.
    +  + + + + + + + + + + + + + + + + + + + + + + + + +
    Vertical Retrace Start Register +(Index 10h)
    76543210
    Vertical Retrace Start
    +  +
      +
    • +Vertical Retrace Start
    • + +
      This field specifies bits 7-0 of the Vertical Retrace Start field.  +Bits 9-8 are located in the Overflow Register.  +This field controls the start of the vertical retrace pulse which signals +the display to move up to the beginning of the active display.  This +field contains the value of the vertical scanline counter at the beginning +of the first scanline where the vertical retrace signal is asserted.
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Vertical Retrace End Register (Index +11h)
    76543210
    ProtectBandwidthVertical Retrace End
    +  +
      +
    • +Protect -- CRTC Registers Protect Enable
    • + +
      This field is used to protect the video timing registers from being +changed by programs written for earlier graphics chipsets that attempt +to program these registers with values unsuitable for VGA timings.  +When this field is set to 1, the CRTC register indexes 00h-07h ignore write +access, with the exception of bit 4 of the Overflow Register, +which holds bit 8 of the Line Compare field. +
    • +Bandwidth -- Memory Refresh Bandwidth
    • + +
      Nearly all video chipsets include a few registers that control memory, +bus, or other timings not directly related to the output of the video card.  +Most VGA/SVGA implementations ignore the value of this field; however, +in the least, IBM VGA adapters do utilize it and thus for compatibility +with these chipsets this field should be programmed.  This register +is used in the IBM VGA hardware to control the number of DRAM refresh cycles +per scan line.  The three refresh cycles per scanline is appropriate +for the IBM VGA horizontal frequency of approximately 31.5 kHz.  For +horizontal frequencies greater than this, this setting will work as the +DRAM will be refreshed more often.  However, refreshing not often +enough for the DRAM can cause memory loss.  Thus at some point slower +than 31.5 kHz the five refresh cycle setting should be used.  At which +particular point this should occur, would require better knowledge of the +IBM VGA's schematics than I have available.  According to IBM documentation, +"Selecting five refresh cycles allows use of the VGA chip with 15.75 +kHz displays." which isn't really enough to go by unless the mode you +are defining has a 15.75 kHz horizontal frequency. +
    • +Vertical Retrace End
    • + +
      This field determines the end of the vertical retrace pulse, and thus +its length.  This field contains the lower four bits of the vertical +scanline counter at the beginning of the scanline immediately after the +last scanline where the vertical retrace signal is asserted.
    +  + + + + + + + + + + + + + + + + + + + + + + + + +
    Vertical Display End Register (Index +12h)
    76543210
    Vertical Display End
    +  +
      +
    • +Vertical Display End
    • + +
      This contains the bits 7-0 of the Vertical Display End field.  +Bits 9-8 are located in the Overflow Register.  +The field contains the value of the vertical scanline counter at the beggining +of the scanline immediately after the last scanline of active display.
    +  + + + + + + + + + + + + + + + + + + + + + + + + +
    Offset Register (Index 13h)
    76543210
    Offset
    +  +
      +
    • +Offset
    • + +
      This field specifies the address difference between consecutive scan +lines or two lines of characters. Beginning with the second scan line, +the starting scan line is increased by twice the value of this register +multiplied by the current memory address size (byte = 1, word = 2, double-word += 4) each line. For text modes the following equation is used: +
              Offset = Width / ( MemoryAddressSize +* 2 ) +
      and in graphics mode, the following equation is used: +
               Offset = Width +/ ( PixelsPerAddress * MemoryAddressSize * 2 ) +
      where Width is the width in pixels of the screen. This register can +be modified to provide for a virtual resolution, in which case Width is +the width is the width in pixels of the virtual screen. PixelsPerAddress +is the number of pixels stored in one display memory address, and MemoryAddressSize +is the current memory addressing size.
    +  +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Underline Location Register (Index +14h)
    76543210
    DWDIV4Underline Location
    +  +
      DW - Double-Word Addressing
      +
      "When this bit is set to 1, memory addresses are doubleword addresses. +See the description of the word/byte mode bit (bit 6) in the CRT Mode Control +Register" +
      DIV4 - Divide Memory Address Clock by 4
      +
      "When this bit is set to 1, the memory-address counter is clocked +with the character clock divided by 4, which is used when doubleword addresses +are used." +
      Underline Location
      +
      "These bits specify the horizontal scan line of a character row +on which an underline occurs. The value programmed is the scan line desired +minus 1."
    +  + + + + + + + + + + + + + + + + + + + + + + + + +
    Start Vertical Blanking Register +(Index 15h)
    76543210
    Start Vertical Blanking
    +  +
      +
    • +Start Vertical Blanking
    • + +
      This contains bits 7-0 of the Start Vertical Blanking field.  +Bit 8 of this field is located in the Overflow Register, +and bit 9 is located in the Maximum Scan Line Register.  +This field determines when the vertical blanking period begins, and contains +the value of the vertical scanline counter at the beginning of the first +vertical scanline of blanking.
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + +
    End Vertical Blanking Register (Index +16h)
    76543210
    End Vertical Blanking
    +  +
      +
    • +End Vertical Blanking
    • + +
      This field determines when the vertical blanking period ends, and contains +the value of the vertical scanline counter at the beginning of the vertical +scanline immediately after the last scanline of blanking.
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CRTC Mode Control Register (Index +17h)
    76543210
    SEWord/ByteAWDIV2SLDIVMAP14MAP13
    +  +
      SE -- Sync Enable
      +
      "When set to 0, this bit disables the horizontal and vertical retrace +signals and forces them to an inactive level. When set to 1, this bit enables +the horizontal and vertical retrace signals. This bit does not reset any +other registers or signal outputs." +
      Word/Byte -- Word/Byte Mode Select
      +
      "When this bit is set to 0, the word mode is selected. The word +mode shifts the memory-address counter bits to the left by one bit; the +most-significant bit of the counter appears on the least-significant bit +of the memory address outputs.  The doubleword bit in the Underline +Location register (0x14) also controls the addressing. When the doubleword +bit is 0, the word/byte bit selects the mode. When the doubleword bit is +set to 1, the addressing is shifted by two bits. When set to 1, bit 6 selects +the byte address mode." +
      AW -- Address Wrap Select
      +
      "This bit selects the memory-address bit, bit MA 13 or MA 15, that +appears on the output pin MA 0, in the word address mode. If the VGA is +not in the word address mode, bit 0 from the address counter appears on +the output pin, MA 0. When set to 1, this bit selects MA 15. In odd/even +mode, this bit should be set to 1 because 256KB of video memory is installed +on the system board. (Bit MA 13 is selected in applications where only +64KB is present. This function maintains compatibility with the IBM Color/Graphics +Monitor Adapter.)" +
      DIV2 -- Divide Memory Address clock by 2
      +
      "When this bit is set to 0, the address counter uses the character +clock. When this bit is set to 1, the address counter uses the character +clock input divided by 2. This bit is used to create either a byte or word +refresh address for the display buffer." +
      SLDIV -- Divide Scan Line clock by 2
      +
      "This bit selects the clock that controls the vertical timing counter. +The clocking is either the horizontal retrace clock or horizontal retrace +clock divided by 2. When this bit is set to 1. the horizontal retrace clock +is divided by 2. Dividing the clock effectively doubles the vertical resolution +of the CRT controller. The vertical counter has a maximum resolution of +1024 scan lines because the vertical total value is 10-bits wide. If the +vertical counter is clocked with the horizontal retrace divided by 2, the +vertical resolution is doubled to 2048 scan lines." +
      MAP14 -- Map Display Address 14
      +
      "This bit selects the source of bit 14 of the output multiplexer. +When this bit is set to 0, bit 1 of the row scan counter is the source. +When this bit is set to 1, the bit 14 of the address counter is the source." +
      MAP13 -- Map Display Address 13
      +
      "This bit selects the source of bit 13 of the output multiplexer. +When this bit is set to 0, bit 0 of the row scan counter is the source, +and when this bit is set to 1, bit 13 of the address counter is the source. +The CRT controller used on the IBM Color/Graphics Adapter was capable of +using 128 horizontal scan-line addresses. For the VGA to obtain 640-by-200 +graphics resolution, the CRT controller is  programmed for 100 horizontal +scan lines with two scan-line addresses per character row. Row scan  +address bit 0 becomes the most-significant address bit to the display buffer. +Successive scan lines of  the display image are displaced in 8KB of +memory. This bit allows compatibility with the graphics modes of earlier +adapters."
    +  + + + + + + + + + + + + + + + + + + + + + + + + +
    Line Compare Register (Index 18h)
    76543210
    Line Compare Register
    +  +
      +
    • +Line Compare Register
    • + +
      This field specifies bits 7-0 of the Line Compare field. Bit 9 of this +field is located in the Maximum Scan Line Register, and +bit 8 of this field is located in the Overflow Register. +The Line Compare field specifies the scan line at which a horizontal division +can occur, providing for split-screen operation. If no horizontal division +is required, this field should be set to 3FFh. When the scan line counter +reaches the value in the Line Compare field, the current scan line address +is reset to 0 and the Preset Row Scan is presumed to be 0. If the Pixel +Panning Mode field is set to 1 then the Pixel Shift Count and Byte +Panning fields are reset to 0 for the remainder of the display cycle.
    +Notice: All trademarks used or referred to on this page are the property +of their respective owners. +
    All pages are Copyright © 1997, 1998, J. D. Neal, except where +noted. Permission for utilization and distribution +
    is subject to the terms of the FreeVGA Project +Copyright License. + + diff --git a/specs/freevga/vga/extreg.htm b/specs/freevga/vga/extreg.htm new file mode 100644 index 0000000..d8ceb76 --- /dev/null +++ b/specs/freevga/vga/extreg.htm @@ -0,0 +1,282 @@ + + + + + + + VGA/SVGA Video Programming--External Regsters + + + +
      +
      Home Back  +
      Hardware Level VGA and SVGA Video Programming Information +Page
      + +
      External Regsters
      + +
      +
      +
    +        The External Registers (sometimes +called the General Registers) each have their own unique I/O location in +the VGA, although sometimes the Read Port differs from the Write port, +and some are Read-only.. See the Accessing the VGA +Registers section for more detals. +
      +
    • +Port 3CCh/3C2h -- Miscellaneous Output Register
    • + +
    • +Port 3CAh/3xAh -- Feature Control Register
    • + +
    • +Port 3C2h -- Input Status #0 Register
    • + +
    • +Port 3xAh -- Input Status #1 Register
    • +
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Miscellaneous Output Register +(Read at 3CCh, Write at 3C2h)
    76543210
    VSYNCPHSYNCPO/E PageClock SelectRAM En.I/OAS
    +  +
      VSYNCP -- Vertical Sync Polarity
      +
      "Determines the polarity of the vertical sync pulse and can be used +(with HSP) to control the vertical size of the display by utilizing the +autosynchronization feature of VGA displays. +
        = 0 selects a positive vertical retrace sync pulse." +
      HSYNCP -- Horizontal Sync Polarity
      +
      "Determines the polarity of the horizontal sync pulse. +
        = 0 selects a positive horizontal retrace sync pulse." +
      O/E Page -- Odd/Even Page Select
      +
      "Selects the upper/lower 64K page of memory when the system is in +an eve/odd mode (modes 0,1,2,3,7). +
        = 0 selects the low page +
        = 1 selects the high page" +
    • +Clock Select
    • + +
      This field controls the selection of the dot clocks used in driving +the display timing.  The standard hardware has 2 clocks available +to it, nominally 25 Mhz and 28 Mhz.  It is possible that there may +be other "external" clocks that can be selected by programming this register +with the undefined values.  The possible valuse of this register are: +
        +
      • +00 -- select 25 Mhz clock (used for 320/640 pixel wide modes)
      • + +
      • +01 -- select 28 Mhz clock (used for 360/720 pixel wide modes)
      • + +
      • +10 -- undefined (possible external clock)
      • + +
      • +11 -- undefined (possible external clock)
      • +
      +RAM En. -- RAM Enable
      +
      "Controls system access to the display buffer. +
        = 0 disables address decode for the display buffer from the +system +
        = 1 enables address decode for the display buffer from the +system" +
      I/OAS -- Input/Output Address Select
      +
      "This bit selects the CRT controller addresses. When set to 0, this +bit sets the CRT controller addresses to 0x03Bx and the address for the +Input Status Register 1 to 0x03BA for compatibility withthe monochrome +adapter.  When set to 1, this bit sets CRT controller addresses to +0x03Dx and the Input Status Register 1 address to 0x03DA for compatibility +with the color/graphics adapter. The Write addresses to the Feature Control +register are affected in the same manner."
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Feature Control Register (Read +at 3CAh, Write at 3BAh (mono) or 3DAh (color))
    76543210
    FC1FC0
    +  +
      +
    • +FC1 -- Feature Control bit 1
      +
      "All bits are reserved."
    • + +
    • +FC2 -- Feature Control bit 0
      +
      "All bits are reserved."
    • +
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Input Status #0 Register (Read-only +at 3C2h)
    76543210
    SS
    +  +
      SS - Switch Sense
      +
      "Returns the status of the four sense switches as selected by the +CS field of the Miscellaneous Output Register."
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Input Status #1 Register (Read +at 3BAh (mono) or 3DAh (color))
    76543210
    VRetraceDD
    +  +
      VRetrace -- Vertical Retrace
      +
      "When set to 1, this bit indicates that the display is in a vertical +retrace interval.This bit can be programmed, through the Vertical Retrace +End register, to generate an interrupt at the start of the vertical retrace." +
      DD -- Display Disabled
      +
      "When set to 1, this bit indicates a horizontal or vertical retrace +interval. This bit is the real-time status of the inverted 'display enable' +signal. Programs have used this status bit to restrict screen updates to +the inactive display intervals in order to reduce screen flicker. The video +subsystem is designed to eliminate this software requirement; screen updates +may be made at any time without screen degradation."
    +Notice: All trademarks used or referred to on this page are the property +of their respective owners. +
    All pages are Copyright © 1997, 1998, J. D. Neal, except where +noted. Permission for utilization and distribution is subject to the terms +of the FreeVGA Project Copyright License. + + diff --git a/specs/freevga/vga/graphreg.htm b/specs/freevga/vga/graphreg.htm new file mode 100644 index 0000000..e557863 --- /dev/null +++ b/specs/freevga/vga/graphreg.htm @@ -0,0 +1,585 @@ + + + + + + + VGA/SVGA Video Programming--Graphics Registers + + + +
    Home Back  +
    Hardware Level VGA and SVGA Video Programming Information +Page
    + +
    Graphics Registers  +
    + + +

            The Graphics Registers are +accessed via a pair of registers, the Graphics Address Register and the +Graphics Data Register. See the Accessing the VGA +Registers section for more details. The Address Register is located +at port 3CEh and the Data Register is located at port 3CFh. +

      +
    • +Index 00h -- Set/Reset Register
    • + +
    • +Index 01h -- Enable Set/Reset Register
    • + +
    • +Index 02h -- Color Compare Register
    • + +
    • +Index 03h -- Data Rotate Register
    • + +
    • +Index 04h -- Read Map Select Register
    • + +
    • +Index 05h -- Graphics Mode Register
    • + +
    • +Index 06h -- Miscellaneous Graphics Register
    • + +
    • +Index 07h -- Color Don't Care Register
    • + +
    • +Index 08h -- Bit Mask Register
    • +
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Set/Reset Register (Index 00h)
    76543210
    Set/Reset
    +  +
      +
    • +Set/Reset
    • + +
      Bits 3-0 of this field represent planes 3-0 of the VGA display memory. +This field is used by Write Mode 0 and Write Mode 3 (See the Write +Mode field.) In Write Mode 0, if the corresponding bit in the Enable +Set/Reset field is set, and in Write Mode 3 regardless of the Enable +Set/Reset field, the value of the bit in this field is expanded to +8 bits and substituted for the data of the respective plane and passed +to the next stage in the graphics pipeline, which for Write Mode 0 is the +Logical Operation unit and for Write Mode 3 is the Bit +Mask unit.
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Enable Set/Reset Register (Index +01h)
    76543210
    Enable Set/Reset
    +  +
      +
    • +Enable Set/Reset
    • + +
      Bits 3-0 of this field represent planes 3-0 of the VGA display memory. +This field is used in Write Mode 0 (See the Write Mode +field) to select whether data for each plane is derived from host data +or from expansion of the respective bit in the Set/Reset +field.
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Color Compare Register (Index 02h)
    76543210
    Color Compare
    +  +
      +
    • +Color Compare
    • + +
      Bits 3-0 of this field represent planes 3-0 of the VGA display memory. +This field holds a reference color that is used by Read Mode 1 (See the +Read Mode field.) Read Mode 1 returns the result of the +comparison between this value and a location of display memory, modified +by the Color Don't Care field.
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Data Rotate Register (Index 03h)
    76543210
    Logical OperationRotate Count
    +  +
      +
    • +Logical Operation
    • + +
      This field is used in Write Mode 0 and Write Mode 2 (See the Write +Mode field.) The logical operation stage of the graphics pipeline is +32 bits wide (1 byte * 4 planes) and performs the operations on its inputs +from the previous stage in the graphics pipeline and the latch register. +The latch register remains unchanged and the result is passed on to the +next stage in the pipeline. The results based on the value of this field +are: +
        +
      • +00b - Result is input from previous stage unmodified.
      • + +
      • +01b - Result is input from previous stage logical ANDed with latch register.
      • + +
      • +10b - Result is input from previous stage logical ORed with latch register.
      • + +
      • +11b - Result is input from previous stage logical XORed with latch register.
      • +
      + +
    • +Rotate Count
    • + +
      This field is used in Write Mode 0 and Write Mode 3 (See the Write +Mode field.) In these modes, the host data is rotated to the right +by the value specified by the value of this field. A rotation operation +consists of moving bits 7-1 right one position to bits 6-0, simultaneously +wrapping bit 0 around to bit 7, and is repeated the number of times specified +by this field.
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Read Map Select Register (Index +04h)
    76543210
    Read Map Select
    +  +
      +
    • +Read Map Select
    • + +
      This value of this field is used in Read Mode 0 (see the Read +Mode field) to specify the display memory plane to transfer data from. +Due to the arrangement of video memory, this field must be modified four +times to read one or more pixels values in the planar video modes.
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Graphics Mode Register (Index 05h)
    76543210
    Shift256Shift Reg.Host O/ERead ModeWrite Mode
    +  +
      +
    • +Shift256 -- 256-Color Shift Mode
      +
      "When set to 0, this bit allows bit 5 to control the loading of +the shift registers. When set to 1, this bit causes the shift registers +to be loaded in a manner that supports the 256-color mode."
    • + +
      Shift Reg. -- Shift Register Interleave Mode
      +
      "When set to 1, this bit directs the shift registers in the graphics +controller to format the serial data stream with even-numbered bits from +both maps on even-numbered maps, and odd-numbered bits from both maps on +the odd-numbered maps. This bit is used for modes 4 and 5." +
      Host O/E -- Host Odd/Even Memory Read Addressing Enable
      +
      "When set to 1, this bit selects the odd/even addressing mode used +by the IBM Color/Graphics Monitor Adapter. Normally, the value here follows +the value of Memory Mode register bit 2 in the sequencer." +
    • +Read Mode
    • + +
      This field selects between two read modes, simply known as Read Mode +0, and Read Mode 1, based upon the value of this field: +
        +
      • +0b -- Read Mode 0: In this mode, a byte from one of the four planes is +returned on read operations. The plane from which the data is returned +is determined by the value of the Read Map Select field.
      • +
      + +
    • +1b -- Read Mode 1: In this mode, a comparison is made between display memory +and a reference color defined by the Color Compare field. +Bit planes not set in the Color Don't Care field then +the corresponding color plane is not considered in the comparison. Each +bit in the returned result represents one comparison between the reference +color, with the bit being set if the comparison is true.
    • + +
    • +Write Mode
    • + +
      This field selects between four write modes, simply known as Write +Modes 0-3, based upon the value of this field: +
        +
      • +00b -- Write Mode 0: In this mode, the host data is first rotated as per +the Rotate Count field, then the Enable +Set/Reset mechanism selects data from this or the Set/Reset +field. Then the selected Logical Operation is performed +on the resulting data and the data in the latch register. Then the Bit +Mask field is used to select which bits come from the resulting data +and which come from the latch register. Finally, only the bit planes enabled +by the Memory Plane Write Enable field are +written to memory.
      • + +
      • +01b -- Write Mode 1: In this mode, data is transferred directly from the +32 bit latch register to display memory, affected only by the Memory +Plane Write Enable field. The host data is not used in this mode.
      • + +
      • +10b -- Write Mode 2: In this mode, the bits 3-0 of the host data are replicated +across all 8 bits of their respective planes. Then the selected Logical +Operation is performed on the resulting data and the data in the latch +register. Then the Bit Mask field is used to select which +bits come from the resulting data and which come from the latch register. +Finally, only the bit planes enabled by the Memory +Plane Write Enable field are written to memory.
      • + +
      • +11b -- Write Mode 3: In this mode, the data in the Set/Reset +field is used as if the Enable Set/Reset field were set +to 1111b. Then the host data is first rotated as per the Rotate +Count field, then logical ANDed with the value of the Bit +Mask field. The resulting value is used on the data obtained from the +Set/Reset field in the same way that the Bit Mask field +would ordinarily be used. to select which bits come from the expansion +of the Set/Reset field and which come from the latch +register. Finally, only the bit planes enabled by the Memory +Plane Write Enable field are written to memory.
      • +
      +
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Miscellaneous Graphics Register +(Index 06h)
    76543210
    Memory Map SelectChain O/EAlpha Dis.
    +  +
      +
    • +Memory Map Select
      +
      This field specifies the range of host memory addresses that is decoded +by the VGA hardware and mapped into display memory accesses.  The +values of this field and their corresponding host memory ranges are:
    • + +
        +
      • +00b -- A0000h-BFFFFh (128K region)
      • + +
      • +01b -- A0000h-AFFFFh (64K region)
      • + +
      • +10b -- B0000h-B7FFFh (32K region)
      • + +
      • +11b -- B8000h-BFFFFh (32K region)
      • +
      +Chain O/E -- Chain Odd/Even Enable
      +
      "When set to 1, this bit directs the system address bit, A0, to +be replaced by a higher-order bit. The odd map is then selected when A0 +is 1, and the even map when A0 is 0." +
      Alpha Dis. -- Alphanumeric Mode Disable
      +
      "This bit controls alphanumeric mode addressing. When set to 1, +this bit selects graphics modes, which also disables the character generator +latches."
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Color Don't Care Register (Index +07h)
    76543210
    Color Don't Care
    +  +
      +
    • +Color Don't Care
    • + +
      Bits 3-0 of this field represent planes 3-0 of the VGA display memory. +This field selects the planes that are used in the comparisons made by +Read Mode 1 (See the Read Mode field.) Read Mode 1 returns +the result of the comparison between the value of the Color +Compare field and a location of display memory. If a bit in this field +is set, then the corresponding display plane is considered in the comparison. +If it is not set, then that plane is ignored for the results of the comparison.
    +  + + + + + + + + + + + + + + + + + + + + + + + + +
    Bit Mask Register (Index 08h)
    76543210
    Bit Mask
    +  +
      +
    • +Bit Mask
    • + +
      This field is used in Write Modes 0, 2, and 3 (See the Write +Mode field.) It it is applied to one byte of data in all four display +planes. If a bit is set, then the value of corresponding bit from the previous +stage in the graphics pipeline is selected; otherwise the value of the +corresponding bit in the latch register is used instead. In Write Mode +3, the incoming data byte, after being rotated is logical ANDed with this +byte and the resulting value is used in the same way this field would normally +be used by itself.
    +Notice: All trademarks used or referred to on this page are the property +of their respective owners. +
    All pages are Copyright © 1997, 1998, J. D. Neal, except where +noted. Permission for utilization and distribution is subject to the terms +of the FreeVGA Project Copyright License. + + diff --git a/specs/freevga/vga/license.htm b/specs/freevga/vga/license.htm new file mode 100644 index 0000000..18b2b53 --- /dev/null +++ b/specs/freevga/vga/license.htm @@ -0,0 +1,124 @@ + + + + + + + FreeVGA Copyright License + + + +
    Home Back  +
    Hardware Level VGA and SVGA Video Programming Information Page
    + +
    FreeVGA Project Copyright License  +
    +Introduction +
            This document contains the +FreeVGA Copyright License which states the conditions under which the FreeVGA +Project's Copyrighted information may be used and distributed.  The +conditions of this license ensure that all parties with a need for this +information have the same availability, to the maximum extent possible +as well as ensure the integrity of the documentation. + +

    Disclaimer +
            The author presents this +information as-is without any warranty, including suitability for intended +purpose. The author is not responsible for damages resulting by the use +of the information, incidental or otherwise. By utilizing this information, +you as the programmer take full liability for any damages caused by your +use of this information. If you are not satisfied with these terms, then +your only recourse is to not use this information. While every reasonable +effort is made to ensure that this information is correct, the possibility +exists for error and is not guaranteed for accuracy, and disclaims liability +for any changes, errors or omissions and is not responsible for any damages +that may arise from the use or misuse of this information.  License +to use this information is only granted where this disclaimer applies in +whole. + +

    License +
            The following copyright +license applies to all works by the FreeVGA Project. All of the FreeVGA +Project's documentation is copyrighted by its author, Joshua Neal. + +

    License to utilize the FreeVGA Project documentation is subject to the +following conditions: +

      +
    • +The copyright notice and this permission notice must be preserved complete +on all copies, complete or partial.
    • + +
    • +Duplication is permitted only for personal purposes.  Reduplication +is permitted only under the FreeVGA Project documentation's redistribution +license.
    • + +
    • +The use of the FreeVGA Project documentation to produce translations or +derivative works must be approved specifically by the author.
    • + +
    • +All warnings and disclaimers present in the complete documentation must +apply to the licensee and may not be restricted by locality.  These +must be read before use, and determined to be applicable to the licensee +before the material may be utilized.
    • + +
    • +It is forbidden to represent the FreeVGA Project or to use the FreeVGA +Project's name to solicit or obtain information, services, product, or +endorsements from another party, commercial or otherwise.
    • +
    +If all of the previous conditions are not met, then permission to utilize +the FreeVGA Project's documentation is not granted, and all rights are +reserved. + +

    License to distribute the FreeVGA Project documentation is subject to +the following conditions: +

      +
    • +The copyright notice and this permission notice must be preserved complete +on all copies, complete or partial.
    • + +
    • +An archive of the FreeVGA Project documentation may be distributed in electronic +form only in its entirety, without adding or removing any material, notices, +advertisement, or other information.  Only exact copies of archives +produced or specifically approved by the author may be distributed, and +at the time of distribution, the most recent archive must be distributed.  +The FreeVGA Project documentation must be excluded from any compilation +copyright or other restrictions.  No fee other than the cost of transmission +or the physical media containing the archive may be charged without prior +approval by the author.  The documentation may not be distributed +electronically in part, which includes mirroring in html format on the +internet, unless specific permission is granted by the author.
    • + +
    • +The FreeVGA Project documentation may be distributed in non-electronic +form to students or members of a programming team subject to the condition +that it be provided free of charge.  The documentation may not be +included with or within other copyrighted works unless the other copyrighted +works are also provided free of charge.
    • + +
    • +Small portions may be reproduced as illustrations for reviews or quotes +in other works without this permission notice if proper citation is given +(including URL if the work is online.)
    • + +
    • +Only the current documentation may be distributed.  The URL of the +FreeVGA project online documentation must be provided.  The author +reserves the right to limit distribution by any parties at any time.
    • +
    +If all of the previous conditions are not met, then permission to redistribute +the FreeVGA Project's documentation is not granted, and all distribution +rights are reserved. + +

    Notice: All trademarks used or referred to on this page are the property +of their respective owners. +
    All pages are Copyright © 1997, 1998, J. D. Neal, except where +noted. Permission for utilization and distribution is subject to the terms +of the FreeVGA Project Copyright License. +
      +
      + + diff --git a/specs/freevga/vga/paging.gif b/specs/freevga/vga/paging.gif new file mode 100644 index 0000000000000000000000000000000000000000..74605a61f34b9b2ab4cef305e55f7b8d3e77b875 GIT binary patch literal 2540 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 Cl_3HE literal 0 HcmV?d00001 diff --git a/specs/freevga/vga/paging.txt b/specs/freevga/vga/paging.txt new file mode 100644 index 0000000..f33472c --- /dev/null +++ b/specs/freevga/vga/paging.txt @@ -0,0 +1,29 @@ + Paging Memory Utilization Example + --------------------------------- + + 0 +-------------------------+ 79 + | | + | | + | | + | PAGE 0 | + | | + | | + | | + 1920 | | 1999 + +-------------------------+ + | 48 bytes unused | + +-------------------------+ + 2048 | | 2127 + | | + | | + | PAGE 1 | + | | + | | + | | + 3968 | | 4047 + +-------------------------+ + | | + +-------------------------+ + | | + |_ __ __ __ _ _| + -- --_- - --___-- -- diff --git a/specs/freevga/vga/portidx.htm b/specs/freevga/vga/portidx.htm new file mode 100644 index 0000000..45de68d --- /dev/null +++ b/specs/freevga/vga/portidx.htm @@ -0,0 +1,99 @@ + + + + + + + FreeVGA - VGA I/O Port Index + + + +

    Home Back  +
    Hardware Level VGA and SVGA Video Programming Information Page
    + +
    VGA I/O Port Index  +
    +Introduction +
            This index lists the VGA's +I/O ports in numerical order, making looking up a specific I/O port access +simpler. +
      + + + +

    Notice: All trademarks used or referred to on this page are the property +of their respective owners. +
    All pages are Copyright © 1997, 1998, J. D. Neal, except where +noted. Permission for utilization and distribution is subject to the terms +of the FreeVGA Project Copyright License. +
      +
      +
      + + diff --git a/specs/freevga/vga/seqpack.gif b/specs/freevga/vga/seqpack.gif new file mode 100644 index 0000000000000000000000000000000000000000..dac6336f24f3a66d890db8b76aabe9f1bb7d9374 GIT binary patch literal 5091 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 F06Q+-QzZZZ literal 0 HcmV?d00001 diff --git a/specs/freevga/vga/seqpack.txt b/specs/freevga/vga/seqpack.txt new file mode 100644 index 0000000..8400edc --- /dev/null +++ b/specs/freevga/vga/seqpack.txt @@ -0,0 +1,25 @@ + Packed Shift Mode Diagram + ------------------------- + + Plane 0 Plane 1 + /-----------------^-----------------\ /-----------------^-----------------\ + 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 ++---+---+ +---+---+ +---+---+ +---+---+ +---+---+ +---+---+ +---+---+ +---+---+ +| | | | | | | | | | | | | | | | | | | | | | | | ++---+---+ +---+---+ +---+---+ +---+---+ +---+---+ +---+---+ +---+---+ +---+---+ + | | | | | | | | | | | | | | | | + \ | \ | \ | \ | \ | \ | \ | \ | +3 2 | | 3 2 | | 3 2 | | 3 2 | | 3 2 | | 3 2 | | 3 2 | | 3 2 | | +[][][][] [][][][] [][][][] [][][][] [][][][] [][][][] [][][][] [][][][] + | | 1 0 | | 1 0 | | 1 0 | | 1 0 | | 1 0 | | 1 0 | | 1 0 | | 1 0 + | \ | \ | \ | \ | \ | \ | \ | \ + | | | | | | | | | | | | | | | | ++---+---+ +---+---+ +---+---+ +---+---+ +---+---+ +---+---+ +---+---+ +---+---+ +| | | | | | | | | | | | | | | | | | | | | | | | ++---+---+ +---+---+ +---+---+ +---+---+ +---+---+ +---+---+ +---+---+ +---+---+ + 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 + \-----------------v-----------------/ \-----------------v-----------------/ + Plane 2 Plane 3 + + <------- Direction of Shift + diff --git a/specs/freevga/vga/seqplanr.gif b/specs/freevga/vga/seqplanr.gif new file mode 100644 index 0000000000000000000000000000000000000000..d8d8270e3d7484cc4abb23b358f307e0448ebf22 GIT binary patch literal 3932 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 qY!YjRGJ> + + + + + + VGA/SVGA Video Programming--Sequencer Registers + + + +

    Home Back  +
    Hardware Level VGA and SVGA Video Programming Information +Page
    + +
    Sequencer Registers  +
    + + +

            The Sequencer Registers are +accessed via a pair of registers, the Sequencer Address Register and the +Sequencer Data Register. See the Accessing the VGA +Registers section for more detals. The Address Register is located +at port 3C4h and the Data Register is located at port 3C5h. +

      +
    • +Index 00h -- Reset Register
    • + +
    • +Index 01h -- Clocking Mode Register
    • + +
    • +Index 02h -- Map Mask Register
    • + +
    • +Index 03h -- Character Map Select Register
    • + +
    • +Index 04h -- Sequencer Memory Mode Register
    • +
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Reset Register (Index 00h)
    76543210
    SRAR
    +  +
      SR -- Sychnronous Reset +
      "When set to 0, this bit commands the sequencer to synchronously +clear and halt. Bits 1 and 0 must be 1 to allow the sequencer to operate. +To prevent the loss of data, bit 1 must be set to 0 during the active display +interval before changing the clock selection. The clock is changed through +the Clocking Mode register or the Miscellaneous Output register." +
      AR -- Asynchronous Reset +
      "When set to 0, this bit commands the sequencer to asynchronously +clear and halt. Resetting the sequencer with this bit can cause loss of +video data"
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Clocking Mode Register (Index 01h)
    76543210
    SDS4DCRSLR9/8DM
    +  +
      SD -- Screen Disable +
      "When set to 1, this bit turns off the display and assigns maximum +memory bandwidth to the system. Although the display is blanked, the synchronization +pulses are maintained. This bit can be used for rapid full-screen updates." +
      S4 -- Shift Four Enable +
      "When the Shift 4 field and the Shift Load Field are set to 0, the +video serializers are loaded every character clock. When the Shift 4 field +is set to 1, the video serializers are loaded every forth character clock, +which is useful when 32 bits are fetched per cycle and chained together +in the shift registers." +
      DCR -- Dot Clock Rate +
      "When set to 0, this bit selects the normal dot clocks derived from +the sequencer master clock input. When this bit is set to 1, the master +clock will be divided by 2 to generate the dot clock. All other timings +are affected because they are derived from the dot clock. The dot clock +divided by 2 is used for 320 and 360 horizontal PEL modes." +
      SLR -- Shift/Load Rate +
      "When this bit and bit 4 are set to 0, the video serializers are +loaded every character clock. When this bit is set to 1, the video serializers +are loaded every other character clock, which is useful when 16 bits are +fetched per cycle and chained together in the shift registers. The Type +2 video behaves as if this bit is set to 0; therefore, programs should +set it to 0." +
    • +9/8DM -- 9/8 Dot Mode
    • + +
      This field is used to select whether a character is 8 or 9 dots wide. +This can be used to select between 720 and 640 pixel modes (or 360 and +320) and also is used to provide 9 bit wide character fonts in text mode. +The possible values for this field are: +
        +
      • +0 - Selects 9 dots per character.
      • + +
      • +1 - Selects 8 dots per character.
      • +
      +
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Map Mask Register (Index 02h)
    76543210
    Memory Plane Write Enable
    +  +
      +
    • +Memory Plane Write Enable
    • + +
      Bits 3-0 of this field correspond to planes 3-0 of the VGA display +memory. If a bit is set, then write operations will modify the respective +plane of display memory. If a bit is not set then write operations will +not affect the respective plane of display memory.
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Character Map Select Register (Index +03h)
    76543210
    CSAS2CSBS2Character Set A SelectCharacter Set B Select
    +  +
      +
    • +CSAS2 -- Bit 2 of Character Set A Select
    • + +
      This is bit 2 of the Character Set A Select field. See Character +Set A Select below. +
    • +CSBS2 -- Bit 2 of Character Set B Select
    • + +
      This is bit 2 of the Character Set B field. See Character +Set B Select below. +
    • +Character Set A Select
    • + +
      This field is used to select the font that is used in text mode when +bit 3 of the attribute byte for a character is set to 1. Note that this +field is not contiguous in order to provide EGA compatibility. The font +selected resides in plane 2 of display memory at the address specified +by this field, as follows: +
        +
      • +000b -- Select font residing at 0000h - 1FFFh
      • +
      + +
        +
      • +001b -- Select font residing at 4000h - 5FFFh
      • + +
      • +010b -- Select font residing at 8000h - 9FFFh
      • + +
      • +011b -- Select font residing at C000h - DFFFh
      • + +
      • +100b -- Select font residing at 2000h - 3FFFh
      • + +
      • +101b -- Select font residing at 6000h - 7FFFh
      • + +
      • +110b -- Select font residing at A000h - BFFFh
      • + +
      • +111b -- Select font residing at E000h - FFFFh
      • +
      + +
    • +Character Set B Select
    • + +
      This field is used to select the font that is used in text mode when +bit 3 of the attribute byte for a character is set to 0. Note that this +field is not contiguous in order to provide EGA compatibility. The font +selected resides in plane 2 of display memory at the address specified +by this field, identical to the mapping used by Character +Set A Select above.
    +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Sequencer Memory Mode Register (Index +04h)
    76543210
    Chain 4O/E Dis.Ext. Mem
    +  +
      Chain 4 -- Chain 4 Enable +
      "This bit controls the map selected during system read operations. +When set to 0, this bit enables system addresses to sequentially access +data within a bit map by using the Map Mask register. When setto 1, this +bit causes the two low-order bits to select the map accessed as shown below. +
      Address Bits +
        A0 A1            +Map Selected +
         0   0              +0 +
         0   1              +1 +
         1   0              +2 +
         1   1              +3" +
      O/E Dis. -- Odd/Even Host Memory Write Adressing Disable
      +
      "When this bit is set to 0, even system addresses access maps 0 +and 2, while odd system addresses access maps 1 and 3. When this bit is +set to 1, system addresses sequentially access data within a bit map, and +the maps are accessed according to the value in the Map Mask register (index +0x02)." +
      Ext. Mem -- Extended Memory
      +
      "When set to 1, this bit enables the video memory from 64KB to 256KB. +This bit must be set to 1 to enable the character map selection described +for the previous register."
    +Notice: All trademarks used or referred to on this page are the property +of their respective owners. +
    All pages are Copyright © 1997, 1998, J. D. Neal, except where +noted. Permission for utilization and distribution is subject to the terms +of the FreeVGA Project Copyright License. + + diff --git a/specs/freevga/vga/textcur.htm b/specs/freevga/vga/textcur.htm new file mode 100644 index 0000000..3f1fa5f --- /dev/null +++ b/specs/freevga/vga/textcur.htm @@ -0,0 +1,137 @@ + + + + + + + VGA/SVGA Video Programming--Manipulating the Text-mode Cursor + + + +
    Home Intro Visibility +Position Shape Blink +Rate Color Back  +
    Hardware Level VGA and SVGA Video Programming Information +Page
    + +
    Manipulating the Text-mode Cursor  +
    + + +Introduction +
            When dealing with +the cursor in most high-level languages, the cursor is defined as the place +where the next text output will appear on the display. When dealing directly +with the display, the cursor is simply a blinking area of a particular +character cell. A program may write text directly to the display independent +of the current location of the cursor. The VGA provides facilities for +specifying whether a cursor is to be displayed, where the cursor is to +appear, and the shape of the cursor itself. Note that this cursor is only +used in the text modes of the standard VGA and is not to be confused with +the graphics cursor capabilities of particular SVGA chipsets. + +

    Enabling/Disabling the Cursor +
            On the VGA there are three +main ways of disabling the cursor. The most straightforward is to set the +Cursor Disable field to 1. Another way is +to set the Cursor Scan Line End field to a +value less than that of the Cursor Scan Line Start +field. On some adapters such as the IBM EGA, this will result instead in +a split block cursor. The third way is to set the cursor location to a +location off-screen. The first two methods are specific to VGA and compatible +adapters and are not guaranteed to work on non-VGA adapters, while the +third method should. + +

    Manipulating the Cursor Position +
            When dealing with +the cursor in standard BIOS text modes, the cursor position is specified +by row and column. The VGA hardware, due to its flexibility to display +any different text modes, specifies cursor position as a 16-bit address. +The upper byte of this address is specified by the Cursor +Location High Register, and the lower by the Cursor +Location Low Register. In addition this value is affected by the Cursor +Skew field. When the hardware fetches a character from display memory +it compares the address of the character fetched to that of the cursor +location added to the Cursor Skew field. If +they are equal and the cursor is enabled, then the character is written +with the current cursor pattern superimposed. Note that the address compared +to the cursor location is the address in display memory, not the address +in host memory. Characters and their attributes are stored at the same +address in display memory in different planes, and it is the odd/even addressing +mode usually used in text modes that makes the interleaved character/attribute +pairs in host memory possible. Note that it is possible to set the cursor +location to an address not displayed, effectively disabling the cursor. +
            The Cursor +Skew field was used on the EGA to synchronize the cursor with internal +timing. On the VGA this is not necessary, and setting this field to any +value other than 0 may result in undesired results. For example, on one +particular card, setting the cursor position to the rightmost column and +setting the skew to 1 made the cursor disappear entirely. On the same card, +setting the cursor position to the leftmost column and setting the skew +to 1 made an additional cursor appear above and to the left of the correct +cursor. At any other position, setting the skew to 1 simply moved the cursor +right one position. Other than these undesired effects, there is no function +that this register can provide that could not be obtained by simply increasing +the cursor location. + +

    Manipulating the Cursor Shape +
           On the VGA, the text-mode +cursor consists of a line or block of lines that extend horizontally across +the entire scan line of a character cell. The first, topmost line is specified +by the Cursor Scan Line Start field. The last, +bottom most line is specified by the Cursor Scan +Line End field. The scan lines in a character cell are numbered from +0 up to the value of the Maximum Scan Line +field. On the VGA if the Cursor Scan Line End +field is less than the Cursor Scan Line Start +field, no cursor will be displayed. Some adapters, such as the IBM EGA +may display a split-block cursor instead. + +

    Cursor Blink Rate +
            On the standard VGA, the +blink rate is dependent on the vertical frame rate. The on/off state of +the cursor changes every 16 vertical frames, which amounts to 1.875 blinks +per second at 60 vertical frames per second. The cursor blink rate is thus +fixed and cannot be software controlled on the standard VGA. Some SVGA +chipsets provide non-standard means for changing the blink rate of the +text-mode cursor. + +

    Cursor Color +
            On the standard VGA, the +cursor color is obtained from the foreground color of the character that +the cursor is superimposing. On the standard VGA there is no way to modify +this behavior. +
      + +

    Notice: All trademarks used or referred to on this page are the property +of their respective owners. +
    All pages are Copyright © 1997, 1998, J. D. Neal, except where +noted. Permission for utilization and distribution is subject to the terms +of the FreeVGA Project Copyright License. +
      + + diff --git a/specs/freevga/vga/vga.htm b/specs/freevga/vga/vga.htm new file mode 100644 index 0000000..39f95a9 --- /dev/null +++ b/specs/freevga/vga/vga.htm @@ -0,0 +1,226 @@ + + + + + + + VGA/SVGA Video Programming--Standard VGA Chipset Reference + + + +

    Home Intro General +Registers Index Back  +
    Hardware Level VGA and SVGA Video Programming Information +Page
    + +
    VGA Chipset Reference  +
    + + +Introduction +
            This section is intended +to be a reference to the common functionality of the original IBM VGA and +compatible adapters. If you are writing directly to hardware then this +is the lowest common denominator of nearly all video cards in use today. +Nearly all programs requiring the performance of low-level hardware access +resort to this baseline capacity, so this information is still valuable +to programmers. In addition most of the VGA functions apply to SVGA cards +when operating in SVGA modes, so it is best to know how to use them even +when programming more advanced hardware. +
            Most VGA references I have +seen document the VGA by describing its operation in the various BIOS modes. +However, because BIOS was designed for use in MS-DOS real mode applications, +its functionality is limited in other environments. This document is structured +in a way that explains the VGA hardware and its operation independent of +the VGA BIOS modes, which will allow for better understanding of the capabilities +of the VGA hardware. +
            This reference has grown +out of my own notes and experimentation while learning to program the VGA +hardware. During this process I have identified errors in various references +that I have used and have attempted to document the VGA hardware's actual +behavior as best as possible. If in your experience you find any of this +information to be inaccurate, or even if you find this information to be +misleading or inaccurate, please let me know! +
            One of the reasons I started +this reference was that I was using existing references and found myself +wishing for a hypertext reference as almost every register is affected +by the operation of another, and was constantly flipping pages. Here I +simply use links for the register references, such as Offset +Register, rather than stating something like: Offset Register (CRTC: +Offset = 13h, bits 7-0). While the second method is more informative, using +them for every reference to the register makes the text somewhat bogged +down. HTML allows simply clicking on the register name and all of the details +are provided. Another is that no single reference had all of the information +I was looking for, and that I had penciled many corrections and clarifications +into the references themselves. This makes it difficult to switch to a +newer version of a book when another edition comes out -- I still use my +heavily annotated second edition of Ferarro's book, rather than the more +up-to-date third edition. + +

    General Programming Information +
            This section is intended +to provide functional information on various aspects of the VGA. If you +are looking simply for VGA register descriptions look in the next section. +The VGA hardware is complex and can be confusing to program. Rather than +attempt to document the VGA better than existing references by using more +words to describe the registers, this section breaks down the functionality +of the VGA into specific categories of similar functions or by detailing +procedures for performing certain operations. +

    +Input/Output Register Information +
            This section is intended +to provide a detailed reference of the VGA's internal registers. It attempts +to combine information from a variety of sources, including the references +listed in the reference section of the home page; however, rather than +attempting to condense this information into one reference, leaving out +significant detail, I have attempted to expand upon the information available +and provide an accurate, detailed reference that should be useful to any +programmer of the VGA and SVGA. Only those registers that are present and +functional on the VGA are given, so if you are seeking information specific +to the CGA, EGA, MCGA, or MGA adapters try the Other References section +on the home page. +
            In some cases I have changed +the name of the register, not to protect the innocent but simply to make +it clearer to understand. One clarification is the use of "Enable" and +"Disable". A the function of a field with the name ending with "Enable" +is enabled when it is 1, and likewise a field with a name ending in Disable +is disabled when it is 1. Another case is when two fields have similar +or identical names, I have added more description to the name to differentiate +them. +
            It can be difficult to understand +how to manipulate the VGA registers as many registers have been packed +into a small number of I/O ports and accessing them can be non-intuituve, +especially the Attribute Controller Registers, so I have provided a tutorial +for doing this. + +        In order to facilitate understanding +of the registers, one should view them as groups of similar registers, +based upon how they are accessed, as the VGA uses indexed registers to +access most parameters. This also roughly places them in groups of similar +functionality; however, in many cases the fields do not fit neatly into +their category. In certain cases I have utilized quotes from the IBM VGA +Programmer's Reference, this information is given in "italic."  +This is meant to be a temporary placeholder until a better description +can be written, it may not be applicable to a standard VGA implementation.  +Presented to roughly based upon their place in the graphics pipeline between +the CPU and the video outputs are the: + +Indices +
            In order to locate a particular +register quickly, the following indexes are provided. The first is a listing +of all of the register fields of the VGA hardware. This is especially useful +for fields that are split among multiple registers, or for finding the +location of a field that are packed in with other fields in one register. +The second is indexed by function groups each pertaining to a particular +part of the VGA hardware. This makes understanding and programming the +VGA hardware easier by listing the fields by subsystem, as the VGA's fields +are grouped in a somewhat haphazard fashion. The third is intended for +matching a read or write to a particular I/O port address to the section +where it is described. +
      +
    • +VGA Field Index -- An alphabetical listing of +all fields and links to their location.
    • + +
    • +VGA Functional Index -- A listing of all fields +and links to their location grouped by function.
    • + +
    • +VGA I/O Port Index -- A listing of VGA I/O ports +in numerical order.
    • +
    +Notice: All trademarks used or referred to on this page are the property +of their respective owners. +
    All pages are Copyright © 1997, 1998, J. D. Neal, except where +noted. Permission for utilization and distribution is subject to the terms +of the FreeVGA Project Copyright License. + +

      + + diff --git a/specs/freevga/vga/vgacrtc.htm b/specs/freevga/vga/vgacrtc.htm new file mode 100644 index 0000000..71c5b7a --- /dev/null +++ b/specs/freevga/vga/vgacrtc.htm @@ -0,0 +1,210 @@ + + + + + + + FreeVGA - VGA Display Generation + + + +

    Home Intro Clocks +Horizontal Vertical Monitoring +Misc Back  +
    Hardware Level VGA and SVGA Video Programming Information Page
    + +
    VGA Display Generation  +
    +Introduction +
            This page documents the +configuration of the VGA's CRTC registers which control the framing and +timing of video signals sent to the display device, usually a monitor. + +

    Dot Clocks +
            The standard VGA has two +"standard" dot clock frequencies available to it, as well as a possible +"external" clock source, which is implementation dependent.  The two +standard clock frequencies are nominally 25 Mhz and 28 MHz.  Some +chipsets use 25.000 MHz and 28.000 MHz, while others use slightly greater +clock frequencies.  The IBM VGA chipset I have uses 25.1750 MHz  +Mhz and 28.3220 crystals.  Some newer cards use the closest generated +frequency produced by their clock chip.  In most circumstances the +IBM VGA timings can be assumed as the monitor should allow an amount of +variance; however, if you know the actual frequencies used you should use +them in your timing calculations. +
            The dot clock source in +the VGA hardware is selected using the Clock +Select field.  For the VGA, two of the values are undefined; some +SVGA chipsets use the undefined values for clock frequencies used for 132 +column mode and such.  The 25 MHz clock is designed for 320 and 640 +pixel modes and the 28 MHz is designed for 360 and 720 pixel modes. The +Dot Clock Rate field specifies whether to use +the dot clock source directly or to divide it in half before using it as +the actual dot clock rate. + +

    Horizontal Timing +
            The VGA measures horizontal +timing periods in terms of character clocks, which can either be 8 or 9 +dot clocks, as specified by the 9/8 Dot Mode +field.  The 9 dot clock mode was included for monochrome emulation +and 9-dot wide character modes, and can be used to provide 360 and 720 +pixel wide modes that work on all standard VGA monitors, when combined +with a 28 Mhz dot clock. The VGA uses a horizontal character counter which +is incremented at each character, which the horizontal timing circuitry +compares against the values of the horizontal timing fields to control +the horizontal state. The horizontal periods that are controlled are the +active display, overscan, blanking, and refresh periods. +
            The start of the active +display period coincides with the resetting of the horizontal character +counter, thus is fixed at zero.  The value at which the horizontal +character is reset is controlled by the Horizontal +Total field. Note, however, that the value programmed into the Horizontal +Total field is actually 5 less than the actual value due to timing +concerns. +
            The end of the active display +period is controlled by the End Horizontal Display +field.  When the horizontal character counter is equal to the value +of this field, the sequencer begins outputting the color specified by the +Overscan Palette Index field.  This continues +until the active display begins at the beginning of the next scan line +when the active display begins again.  Note that the horizontal blanking +takes precedence over the sequencer and attribute controller. +
            The horizontal blanking +period begins when the character clock equals the value of the Start +Horizontal Blanking field.  During the horizontal blanking period, +the output voltages of the DAC signal the monitor to turn off the guns.   +Under normal conditions, this prevents the overscan color from being displayed +during the horizontal retrace period.  This period extends until the +lower 6 bits of the End Horizontal Blanking +field match the lower 6 bits of the horizontal character counter.  +This allows for a blanking period from 1 to 64 character clocks, although +some implementations may treat 64 as 0 character clocks in length.  +The blanking period may occur anywhere in the scan line, active display +or otherwise even though its meant to appear outside the active display +period.  It takes precedence over all other VGA output.  There +is also no requirement that blanking occur at all.  If the Start +Horizontal Blanking field falls outside the maximum value of the character +clock determined by the Horizontal Total field, +then no blanking will occur at all.  Note that due to the setting +of the Horizontal Total field, the first match +for the End Horizontal Blanking field may +be on the following scan line. +
            Similar to the horizontal +blanking period, the horizontal retrace period is specified by the Start +Horizontal Retrace and End Horizontal Retrace +fields. The horizontal retrace period begins when the character clock equals +the value stored in the Start Horizontal Retrace +field.  The horizontal retrace ends when the lower 5 bits of the character +clock match the bit pattern stored in the End +Horizontal Retrace field, allowing a retrace period from 1 to 32 clocks; +however, a particular implementation may treat 32 clocks as zero clocks +in length.  The operation of this is identical to that of the horizontal +blanking mechanism with the exception of being a 5 bit comparison instead +of 6, and affecting the horizontal retrace signal instead of the horizontal +blanking. +
            There are two horizontal +timing fields that are described as being related to internal timings of +the VGA, the Display Enable Skew and Horizontal +Retrace Skew fields.  In the VGA they do seem to affect the timing, +but also do not seem to be necessary for the operation of the VGA and are +pretty much unused.  These registers were required by the IBM VGA +implementations, so I'm assuming this was added in the early stages of +the VGA design for EGA compatibility, but the internal timings were changed +to more friendly ones making the use of these fields unnecessary.  +It seems to be totally safe to set these fields to 0 and ignore them.  +See the register descriptions for more details, if you have to deal with +software that programs them. + +

    Vertical Timing +
            The VGA maintains a scanline +counter which is used to measure vertical timing periods.  This counter +begins at zero which coincides with the first scan line of the active display.  +This counter is set to zero before the beginning of the first scanline +of the active display.  Depending on the setting of the Divide +Scan Line Clock by 2 field, this counter is incremented either every +scanline, or every second scanline.  The vertical scanline counter +is incremented before the beginning of each horizontal scan line, as all +of the VGA's vertical timing values are measured at the beginning of the +scan line, after the counter has ben set/incremented.  The maximum +value of the scanline counter is specified by the Vertical +Total field.  Note that, like the rest of the vertical timing +values that "overflow" an 8-bit register, the most significant bits are +located in the Overflow Register.  The +Vertical Total field is programmed with the +value of the scanline counter at the beginning of the last scanline. +
            The vertical active display +period begins when the scanline counter is at zero, and extends up to the +value specified by the Vertical Display End +field.  This field is set with the value of the scanline counter at +the beginning of the first inactive scanline, telling the video hardware +when to stop outputting scanlines of sequenced pixel data and outputs the +attribute specified by the Overscan Palette Index +field in the horizontal active display period of those scanlines.  +This continues until the start of the next frame when the active display +begins again. +
            The Start +Vertical Blanking and End Vertical Blanking +fields control the vertical blanking interval.  The Start +Vertical Blanking field is programmed with the value of the scanline +counter at the beginning of the scanline to begin blanking at.  The +value of the End Vertical Blanking field is +set to the lower eight bits of the scanline counter at the beginning of +the scanline after the last scanline of vertical blanking. +
            The Vertical +Retrace Start and Vertical Retrace End +fields determine the length of the vertical retrace interval.  The +Vertical Retrace Start field contains the +value of the scanline counter at the beginning of the first scanline where +the vertical retrace signal is asserted.  The Vertical +Retrace End field is programmed with the value of the lower four bits +of the scanline counter at the beginning of the scanline after the last +scanline where the vertical retrace signal is asserted. + +

    Monitoring Timing +
            There are certain operations +that should be performed during certain periods of the display cycle to +minimize visual artifacts, such as attribute and DAC writes.  There +are two bit fields that return the current state of the VGA, the Display +Disabled and Vertical Retrace fields. +The Display Disabled field is set to 1 when +the display enable signal is not asserted, providing the programmer with +a means to determine if the video hardware is currently refreshing the +active display or it is currently outputting blanking. +
            The Vertical +Retrace field signals whether or not the VGA is in a vertical retrace +period.  This is useful for determining the end of a display period, +which can be used by applications that need to update the display every +period such as when doing animation.  Under normal conditions, when +the blanking signal is asserted during the entire vertical retrace, this +can also be used to detect this period of blanking, such that a large amount +of register accesses can be performed, such as reloading the complete set +of DAC entries. + +

    Miscellaneous +
            There are a few registers +that affect display generation, but don't fit neatly into the horizontal +or vertical timing categories.  The first is the Sync +Enable field which controls whether the horizontal and vertical sync +signals are sent to the display or masked off.  The sync signals should +be disabled while setting up a new mode to ensure that an improper signal +that could damage the display is not being output.  Keeping the sync +disabled for a period of one or more frames helps the display determine +that a mode change has occurred as well. +
        The Memory Refresh Bandwidth +field is used by the original IBM VGA hardware and some compatible VGA/SVGA +chipsets to control how often the display memory is refreshed.  This +field controls whether the VGA hardware provides 3 or 5 memory refresh +cycles per scanline.  At or above VGA horizontal refresh rates, this +field should be programmed for 3 memory refresh cycles per scanline.  +Below this rate, for compatibility's sake the 5 memory refresh cycles per +scanline setting might be safer, see the Memory +Refresh Bandwidth field for (slightly) more information. + +

      +
    Notice: All trademarks used or referred to on this page are the property +of their respective owners. +
    All pages are Copyright © 1997, 1998, J. D. Neal, except where +noted. Permission for utilization and distribution is subject to the terms +of the FreeVGA Project Copyright License. + + diff --git a/specs/freevga/vga/vgadac.htm b/specs/freevga/vga/vgadac.htm new file mode 100644 index 0000000..4a7c05f --- /dev/null +++ b/specs/freevga/vga/vgadac.htm @@ -0,0 +1,190 @@ + + + + + + + VGA/SVGA Video Programming--DAC Operation + + + +

    Home Intro DAC +Programming Precautions +Flicker State Back  +
    Hardware Level VGA and SVGA Video Programming Information +Page
    + +
    DAC Operation  +
    + + +Introduction +
            One of the improvements +the VGA has over the EGA hardware is in the amount of possible colors that +can be generated, in addition to an increase in the amount of colors that +can be displayed at once. The VGA hardware has provisions for up to 256 +colors to be displayed at once, selected from a range of 262,144 (256K) +possible colors. This capability is provided by the DAC subsystem, which +accepts attribute information for each pixel and converts it into an analog +signal usable by VGA displays. + +

    DAC Subsystem +
            The VGA's DAC subsystem +accepts an 8 bit input from the attribute subsystem and outputs an analog +signal that is presented to the display circuitry. Internally it contains +256 18-bit memory locations that store 6 bits each of red, blue, and green +signal levels which have values ranging from 0 (minimum intensity) to 63 +(maximum intensity.) The DAC hardware takes the 8-bit value from the attribute +subsystem and uses it as an index into the 256 memory locations and obtains +a red, green, and blue triad and produces the necessary output. +
            Note -- the DAC subsystem +can be implemented in a number of ways, including discrete components, +in a DAC chip which may or may not contain internal ram, or even integrated +into the main chipset ASIC itself. Many modern DAC chipsets include additional +functionality such as hardware cursor support, extended color mapping, +video overlay, gamma correction, and other functions. Partly because of +this it is difficult to generalize the DAC subsystem's exact behavior. +This document focuses on the common functionality of all VGA DACs; functionality +specific to a particular chipset are described elsewhere. + +

    Programming the DAC +
            The DAC's primary host interface +(there may be a secondary non-VGA compatible access method) is through +a set of four external registers containing the DAC +Write Address, the DAC Read Address, +the DAC Data, and the DAC +State fields. The DAC memory is accessed by writing an index value +to the DAC Write Address field for write +operations, and to the DAC Read Address +field for read operations. Then reading or writing the DAC +Data field, depending on the selected operation, three times in succession +returns 3 bytes, each containing 6 bits of red, green, and blue intensity +values, with red being the first value and blue being the last value read/written. +The read or write index then automatically increments such that the next +entry can be read without having to reprogramming the address. In this +way, the entire DAC memory can be read or written in 768 consecutive I/O +cycles to/from the DAC Data field. The DAC +State field reports whether the DAC is setup to accept reads or writes +next. + +

    Programming Precautions +
            Due to the variances in +the different implementations, programming the DAC takes extra care to +ensure proper operation across the range of possible implementations. There +are a number of things can cause undesired effects, but the simplest way +to avoid problems is to ensure that you program the DAC +Read Address field or the DAC Write Address +field before each read operation (note that a read operation may include +reads/writes to multiple DAC memory entries.) And always perform writes +and reads in groups of 3 color values. The DAC memory may not be updated +properly otherwise. Reading the value of the DAC +Write Address field may not produce the expected result, as some implementations +may return the current index and some may return the next index. This operation +may even be dependent on whether a read or write operation is being performed. +While it may seem that the DAC implements 2 separate indexes for read and +write, this is often not the case, and interleaving read and write operations +may not work properly without reprogramming the appropriate index. +

      +
    • +Read Operation
    • + +
        +
      • +Disable interrupts (this will ensure that a interrupt service routine will +not change the DAC's state)
      • + +
      • +Output beginning DAC memory index to the DAC +Read Address register.
      • + +
      • +Input red, blue, and green values from the DAC +Data register, repeating for the desired number of entries to be read.
      • + +
      • +Enable interrupts
      • +
      + +
    • +Write Operation
    • + +
        +
      • +Disable interrupts (this will ensure that a interrupt service routine will +not change the DAC's state)
      • + +
      • +Output beginning DAC memory index to the DAC +Write Address register.
      • + +
      • +Output red, blue, and green values to the DAC +Data register, repeating for the desired number of entries to be read.
      • + +
      • +Enable interrupts
      • +
      +
    +Eliminating Flicker +
            An important consideration +when programming the DAC memory is the possible effects on the display +generation. If the DAC memory is accessed by the host CPU at the same time +the DAC memory is being used by the DAC hardware, the resulting display +output may experience side effects such as flicker or "snow". Note that +both reading and writing to the DAC memory has the possibility of causing +these effects. The exact effects, if any, are dependent on the specific +DAC implementation. Unfortunately, it is not possible to detect when side-effects +will occur in all circumstances. The best measure is to only access the +DAC memory during periods of horizontal or vertical blanking. However, +this puts a needless burden on programs run on chipsets that are not affected. +If performance is an issue, then allowing the user to select between flicker-prone +and flicker-free access methods could possibly improve performance. + +

    The DAC State +
            The DAC +State field seems to be totally useless, as the DAC state is usually +known by the programmer and it does not give enough information (about +whether a red, green, or blue value is expected next) for a interrupt routine +or such to determine the DAC state. However, I can think of one possible +use for it. You can use the DAC state to allow an interrupt driven routine +to access the palette (like for palette rotation effects or such) while +still allowing the main thread to write to the DAC memory. When the interrupt +routine executes it should check the DAC state. If the DAC state is in +a write state, it should not access the DAC memory. If it is in a read +state, the routine should perform the necessary DAC accesses then return +the DAC to a read state. This means that the main thread use the DAC state +to control the execution of the ISR. Also it means that it can perform +writes to the DAC without having to disable interrupts or otherwise inhibit +the ISR. +
      + +

    Notice: All trademarks used or referred to on this page are the property +of their respective owners. +
    All pages are Copyright © 1997, 1998, J. D. Neal, except where +noted. Permission for utilization and distribution is subject to the terms +of the FreeVGA Project Copyright License. +
      + + diff --git a/specs/freevga/vga/vgafunc.htm b/specs/freevga/vga/vgafunc.htm new file mode 100644 index 0000000..6d09947 --- /dev/null +++ b/specs/freevga/vga/vgafunc.htm @@ -0,0 +1,402 @@ + + + + + + + VGA/SVGA Video Programming--VGA Functional Index + + + +

    Home Register +Memory Sequencing Cursor +Attribute DAC Display +Misc Back  +
    Hardware Level VGA and SVGA Video Programming Information +Page
    + +
    VGA Functional Index  +
    + + +

    Register Access Functions +
            These fields control the +acessability/inaccessability of the VGA registers. These registers are +used for compatibiltiy with older programs that may attempt to program +the VGA in a fashion suited only to an EGA, CGA, or monochrome card. +

    +Display Memory Access Functions +
            These fields control the +way the video RAM is mapped into the host CPU's address space and how memory +reads/writes affect the display memory. + +Display Sequencing Functions +
            These fields affect the +way the video memory is serialized for display. + +Cursor Functions +
            These fields affect the +operation of the cursor displayed while the VGA hardware is in text mode. + +Attribute Functions +
            These fields control the +way the video data is submitted to the RAMDAC, providing color/blinking +capability in text mode and facilitating the mapping of colors in graphics +mode. + +DAC Functions +
            These fields allow control +of the VGA's 256-color palette that is part of the RAMDAC. + +Display Generation Functions +
            These fields control the +formatting and timing of the VGA's video signal output. + +Miscellaneous Functions +
            These fields are used to +detect the state of possible VGA hardware such as configuration switches/jumpers +and feature connector inputs. + +Notice: All trademarks used or referred to on this page are the property +of their respective owners. +
    All pages are Copyright © 1997, 1998, J. D. Neal, except where +noted. Permission for utilization and distribution is subject to the terms +of the FreeVGA Project Copyright License. +
      +
      + + diff --git a/specs/freevga/vga/vgafx.htm b/specs/freevga/vga/vgafx.htm new file mode 100644 index 0000000..fecf2ba --- /dev/null +++ b/specs/freevga/vga/vgafx.htm @@ -0,0 +1,295 @@ + + + + + + + FreeVGA--Special Effects Hardware + + + +
    Home Intro Windowing +Paging Smooth Scrolling Split-Screen +Back +
    Hardware Level VGA and SVGA Video Programming Information +Page
    + +
    Special Effects Hardware  +
    + +
      +
    • +Introduction -- describes the capabilities of the +VGA special effects hardware.
    • + +
    • +Windowing -- provides rough panning and scrolling +of a larger virtual image.
    • + +
    • +Paging -- provides the ability to switch between +multiple screens rapidly.
    • + +
    • +Smooth Panning and Scrolling -- provides more precise +control when panning and scrolling.
    • + +
    • +Split-Screen Operation -- provides a horizontal division +which allows independent scrolling and panning of the top window.
    • +
    +Introduction +
            This section describes the +capabilities of the VGA hardware that can be used to implement special +effects such as windowing, paging, smooth panning and scrolling, and split +screen operation.. These functions are probably the least utilized of all +of the VGA's capabilities, possibly because most texts devoted to video +hardware provide only brief documentation. Also, the video BIOS provides +no support for these capabilities so the VGA card must be programmed at +the hardware level in order to utilize these capabilities. Windowing allows +a program to view a portion of an image in display memory larger than the +current display resolution, providing rough panning and scrolling. Paging +allows multiple display screens to be stored in the display memory allowing +rapid switching between them. Smooth panning and scrolling works in conjunction +with windowing to provide more precise control of window position. Split-screen +operation allows the creation of a horizontal division on the screen that +creates a window below that remains fixed in place independent of the panning +and scrolling of the window above. These features can be combined to provide +powerful control of the display with minimal demand on the host CPU. + +

    Windowing +
            The VGA hardware has the +ability treat the display as a window which can pan and/or scroll across +an image larger than the screen, which is used by some windowing systems +to provide a virtual scrolling desktop, and by some games and assembly +demos to provide scrolling. Some image viewers use this to allow viewing +of images larger than the screen. This capability is not limited to graphics +mode; some terminal programs use this capability to provide a scroll-back +buffer, and some editors use this to provide an editing screen wider than +80 columns. +
            This feature can be implemented +by brute force by simply copying the portion of the image to be displayed +to the screen. Doing this, however takes significant processor horsepower. +For example, scrolling a 256 color 320x200 display at 30 frames per second +by brute force requires a data transfer rate of 1.92 megabytes/second. +However, using the hardware capability of the VGA the same operation would +require a data transfer rate of only 120 bytes/second. Obviously there +is an advantage to using the VGA hardware. However, there are some limitations--one +being that the entire screen must scroll (or the top portion of the screen +if split-screen mode is used.) and the other being that the maximum size +of the virtual image is limited to the amount of video memory accessible, +although it is possible to redraw portions of the display memory to display +larger virtual images. +
            In text mode, windowing +allows panning at the character resolution. In graphics mode, windowing +allows panning at 8-bit resolution and scrolling at scan-line resolution. +For more precise control, see Smooth Panning and Scrolling +below. Because the VGA BIOS and most programming environment's graphics +libraries do not support windowing, you must modify or write your own routines +to write to the display for functions such as writing text or graphics. +This section assumes that you have the ability to work with the custom +resolutions possible when windowing is used. +
            In order to understand virtual +resolutions it is necessary to understand how the VGA's Start +Address High Register, Start Address Low Register, +and Offset field work. Because display memory +in the VGA is accessed by a 32-bit bus, a 16-bit address is sufficient +to uniquely identify any location in the VGA's 256K address space. The +Start Address High Register and Start +Address Low Register provide such an address. This address is used +to specify either the location of the first character in text mode or the +position of the first byte of pixels in graphics mode. At the end of the +vertical retrace, the current line start address is loaded with this value. +This causes one scan line of pixels or characters to be output starting +at this address. At the beginning of the next scan-line (or character row +in text mode) the value of the Offset Register +multiplied by the current memory address size * 2 is added to the current +line start address. The Double-Word Addressing +field and the Word/Byte field specify the +current memory address size. If the value of the Double-Word +Addressing field is 1, then the current memory address size is four +(double-word). Otherwise, the Word/Byte field +specifies the current memory address size. If the value of the Word/Byte +field is 0 then the current memory address size is 2 (word) otherwise, +the current memory address size is 1 (byte). +
            Normally in graphics modes, +the offset register is programmed to represent (after multiplication) the +number of bytes in a scan line. This means that (unless a CGA/MDA emulation +mode is in effect) scan lines will be arranged sequentially in memory with +no space in between, allowing for the most compact representation in display +memory. However, this does not have to be the case--in fact, by increasing +the value of the offset register we can leave "extra space" between lines. +This is what provides for virtual widths. By programming the offset register +to the value of the equation: + +

            Offset = VirtualWidth +/ ( PixelsPerAddress * MemoryAddressSize * 2 ) + +

    VirtualWidth is the width of the virtual resolution in pixels, and PixelsPerAddress +is the number of pixels per display memory address (1, 2, 4 or 8) depending +on the current video mode. For virtual text modes, the offset register +is programmed with the value of the equation: + +

            Offset = VirtualWidth +/ ( MemoryAddressSize * 2 ) + +

    In text mode, there is always one character per display memory address. +In standard CGA compatible text modes, MemoryAddressSize is 2 (word). +
            After you have programmed +the new offset, the screen will now display only a portion of a virtual +display. The screen will display the number of scan-lines as specified +by the current mode. If the screen reaches the last byte of memory, the +next byte of memory will wrap around to the first byte of memory. Remember +that the Start Address specifies the display memory address of the upper-left +hand character or pixel. Thus the maximum height of a virtual screen depends +on the width of the virtual screen. By increasing this by the number of +bytes in a scan-line (or character row), the display will scroll one scan-line +or character row vertically downwards. By increasing the Start Address +by less than the number of bytes in a scan line, you can move the virtual +window horizontally to the right. If the virtual width is the same as the +actual width, one can create a vertical scrolling mode. This is used sometimes +as an "elevator" mode or to provide rapid scrollback capability in text +mode. If the virtual height is the same as the actual height, then only +horizontal panning is possible, sometimes called "panoramic" mode. In any +case, the equation for calculating the Start Address is: + +

            Start Address = StartingOffset ++ Y * BytesPerVirtualRow + X + +

    Y is the vertical position, from 0 to the value of the VitrualHeight +- ActualHeight. X is the horizontal position, from 0 to the value of BytesPerVirtualRow +- BytesPerActualRow . These ranges prevent wrapping around to the left +side of the screen, although you may find it useful to use the wrap-around +for whatever your purpose. Note that the wrap-around simply starts displaying +the next row/scan-line rather than the current one, so is not that useful +(except when using programming techniques that take this factor into account.) +Normally StartingOffset is 0, but if paging or split-screen mode is being +used, or even if you simply want to relocate the screen, you must change +the starting offset to the address of the upper-left hand pixel of the +virtual screen. +
            For example, a 512x300 virtual +screen in a 320x200 16-color 1 bit/pixel planar display would require 512 +pixels / 8 pixels/byte = 64 bytes per row and 64 bytes/row * 300 lines += 19200 bytes per screen. Assuming the VGA is in byte addressing mode, +this means that we need to program the offset register Offset +field with 512 pixels / (8 pixels/byte * 1 * 2) = 32 (20h). Adding one +to the start address will move the display screen to the right eight pixels. +More precise control is provided by the smooth scrolling mechanism. Adding +64 to the start address will move the virtual screen down one scan line. +See the following chart which shows the virtual screen when the start address +is calculated with an X and Y of 0: +

    Click for Textified Virtual Screen Mode Example
    + + +

    Paging +
            The video display memory +may be able to hold more than one screen of data (or virtual screen if +virtual resolutions are used.) These multiple screens, called pages, allows +rapid switching between them. As long as they both have the same actual +(and virtual if applicable) resolution, simply changing the Start Address +as given by the Start Address High Register +and Start Address Low Register pair to point +to the memory address of the first byte of the page (or set the StartingOffset +term in the equation for virtual resolutions to the first memory address +of the page.) If they have different virtual widths, then the Offset +field must be reprogrammed. It is possible to store both graphics and text +pages simultaneously in memory, in addition to different graphics mode +pages. In this case, the video mode must be changed when changing pages. +In addition, in text mode the Cursor Location must be reprogrammed for +each page if it is to be displayed. Also paging allows for double buffering +of the display -- the CPU can write to one page while the VGA hardware +is displaying another. By switching between pages during the vertical retrace +period, flicker free screen updates can be implemented. +
            An example of paging is +that used by the VGA BIOS in the 80x25 text mode. Each page of text takes +up 2000 memory address locations, and the VGA uses a 32K memory aperture, +with the Odd/Even addressing enabled. Because Odd/Even addressing is enabled, +each page of text takes up 4000 bytes in host memory, thus 32768 / 4000 += 8 (rounded down) pages can be provided and can be accessed at one time +by the CPU. Each page starts at a multiple of 4096 (1000h). Because the +display controller circuitry works independent of the host memory access +mode, this means that each page starts at a display address that is a multiple +of 2048 (800h), thus the Starting Address is programmed to the value obtained +by multiplying the page to be displayed by 2048 (800h). See the following +chart which shows the arrangement of these pages in display memory: +
      +

    Click here to display a textified Paging Memory Utilization Example
    + + +

    Smooth Panning and Scrolling +
            Because the Start Address +field only provides for scrolling and panning at the memory address level, +more precise panning and scrolling capability is needed to scroll at the +pixel level as multiple pixels may reside at the same memory address especially +in text mode where the Start Address field only allows panning and scrolling +at the character level. +
            Pixel level panning is controlled +by the Pixel Shift Count and Byte +Panning fields. The Pixel Shift Count +field specifies the number of pixels to shift left. In all graphics modes +and text modes except 9 dot text modes and 256 color graphics modes, the +Pixel Shift Count is defined for values 0-7. +This provides the pixel level control not provided by the Start +Address Register or the Byte Panning fields. +In 9 dot text modes the Pixel Shift Count +is field defined for values 8, and 0-7, with 8 being the minimum shift +amount and 7 being the maximum. In 256 color graphics modes, due to the +way the hardware makes a 256 color value by combining 2 16-bit values, +the Pixel Shift Count field is only defined +for values 0, 2, 4, and 6. Values 1, 3, 5, and 7 cause the screen to be +distorted due to the hardware combining 4 bits from each of 2 adjacent +pixels. The Byte Panning field is added to +the Start Address Register when determining +the address of the top-left hand corner of the screen, and has the value +from 0-3. Combined, both panning fields allow a shift of 15, 31, or 35 +pixels, dependent upon the video mode. Note that programming the Pixel +Shift Count field to an undefined value may cause undesired effects +and these effects are not guaranteed to be identical on all chipsets, so +it is best to be avoided. +
            Pixel level scrolling is +controlled by the Preset Row Scan field. This +field may take any value from 0 up to the value of the Maximum +Scan Line field; anything greater causes interesting artifacts (there +is no guarantee that the result will be the same for all VGA chipsets.) +Incrementing this value will shift the screen upwards by one scan line, +allowing for smooth scrolling in modes where the Offset field does not +provide precise control. + +

    Split-screen Operation +
            The VGA hardware provides +the ability to specify a horizontal division which divides the screen into +two windows which can start at separate display memory addresses. In addition, +it provides the facility for panning the top window independent of the +bottom window. The hardware does not provide for split-screen modes where +multiple video modes are possible in one display screen as provided by +some non-VGA graphics controllers. In addition, there are some limitations, +the first being that the bottom window's starting display memory address +is fixed at 0. This means that (unless you are using split screen mode +to duplicate memory on purpose) the bottom screen must be located first +in memory and followed by the top. The second limitation is that either +both windows are panned by the same amount, or only the top window pans, +in which case, the bottom window's panning values are fixed at 0. Another +limitation is that the Preset Row Scan field +only applies to the top window -- the bottom window has an effective Preset +Row Scan value of 0. +
            The Line Compare field in +the VGA, of which bit 9 is in the Maximum Scan +Line Register, bit 8 is in the Overflow Register, +and bits 7-0 are in the Line Compare Register, +specifies the scan line address of the horizontal division. When the line +counter reaches the value in the Line Compare Register, the current scan +line start address is reset to 0. If the Pixel +Panning Mode field is set to 1 then the Pixel +Shift Count and Byte Panning fields are +reset to 0 for the remainder of the display cycle allowing the top window +to pan while the bottom window remains fixed. Otherwise, both windows pan +by the same amount. +
      + +

    Notice: All trademarks used or referred to on this page are the property +of their respective owners. +
    All pages are Copyright © 1997, 1998, J. D. Neal, except where +noted. Permission for utilization and distribution is subject to the terms +of the FreeVGA Project Copyright License. + + diff --git a/specs/freevga/vga/vgamem.htm b/specs/freevga/vga/vgamem.htm new file mode 100644 index 0000000..bef7f09 --- /dev/null +++ b/specs/freevga/vga/vgamem.htm @@ -0,0 +1,334 @@ + + + + + + + VGA/SVGA Video Programming--Accessing the VGA Display Memory + + + +

    Home Intro Detecting +Mapping Addressing Manipulating +Reading Writing Back  +
    Hardware Level VGA and SVGA Video Programming Information +Page
    + +
    Accessing the VGA Display Memory  +
    + + +Introduction +
            The standard VGA hardware +contains up to 256K of onboard display memory. While it would seem logical +that this memory would be directly available to the processor, this is +not the case. The host CPU accesses the display memory through a window +of up to 128K located in the high memory area. (Note that many SVGA chipsets +provide an alternate method of accessing video memory directly, called +a Linear Frame Buffer.) Thus in order to be able to access display memory +you must deal with registers that control the mapping into host address +space. To further complicate things, the VGA hardware provides support +for memory models similar to that used by the monochrome, CGA, EGA, and +MCGA adapters. In addition, due to the way the VGA handles 16 color modes, +additional hardware is included that can speed access immensely. Also, +hardware is present that allows the programer to rapidly copy data from +one area of display memory to another. While it is quite complicated to +understand, learning to utilize the VGA's hardware at a low level can vastly +improve performance. Many game programmers utilize the BIOS mode 13h, simply +because it offers the simplest memory model and doesn't require having +to deal with the VGA's registers to draw pixels. However, this same decision +limits them from being able to use the infamous X modes, or higher resolution +modes. + +

    Detecting the Amount of Display Memory on the +Adapter +
            Most VGA cards in +existence have 256K on board; however there is the possibility that some +VGA boards have less. To actually determine further if the card has 256K +one must actually write to display memory and read back values. If RAM +is not present in a location, then the value read back will not equal the +value written. It is wise to utilize multiple values when doing this, as +the undefined result may equal the value written. Also, the card may alias +addresses, causing say the same 64K of RAM to appear 4 times in the 256K +address space, thus it is wise to change an address and see if the change +is reflected anywhere else in display memory. In addition, the card may +buffer one location of video memory in the chipset, making it appear that +there is RAM at an address where there is none present, so you may have +to read or write to a second location to clear the buffer. Not that if +the Extended Memory field is not set to 1, +the adapter appears to only have 64K onboard, thus this bit should be set +to 1 before attempting to determine the memory size. + +

    Mapping of Display Memory into CPU Address +Space +
            The first element that defines +this mapping is whether or not the VGA decodes accesses from the CPU. This +is controlled by the RAM Enable field. +If display memory decoding is disabled, then the VGA hardware ignores writes +to its address space. The address range that the VGA hardware decodes is +based upon the Memory Map Select field. The +following table shows the address ranges in absolute 32-bit form decoded +for each value of this field: +

      +
    • +00 -- A0000h-BFFFFh -- 128K
    • + +
    • +01 -- A0000h-AFFFFh -- 64K
    • + +
    • +10 -- B0000h-B7FFFh -- 32K
    • + +
    • +11 -- B8000h-BFFFFh -- 32K
    • +
    +Note -- It would seem that by setting the Memory +Map Select field to 00 and then using planar memory access that you +could gain access to more than 256K of memory on an SVGA card. However, +I have found that some cards simply mirror the first 64K twice within the +128K address space. This memory map is intended for use in the Chain Odd/Even +modes, eliminating the need to use the Odd/Even Page Select field. Also +I have found that MS-DOS memory managers don't like this very much and +are likely to lock up the system if configured to use the area from B0000h-B7FFFh +for loading device drivers high. + +

    Host Address to Display Address Translation +
            The most complicated part +of accessing display memory involves the translation between a host address +and a display memory address. Internally, the VGA has a 64K 32-bit memory +locations. These are divided into four 64K bit planes. Because the VGA +was designed for 8 and 16 bit bus systems, and due to the way the Intel +chips handle memory accesses, it is impossible for the host CPU to access +the bit planes directly, instead relying on I/O registers to make part +of the memory accessible. The most straightforward display translation +is where a host access translates directly to a display memory address. +What part of the particular 32-bit memory location is dependent on certain +registers and is discussed in more detail in Manipulating Display Memory +below. The VGA has three modes for addressing, Chain 4, Odd/Even mode, +and normal mode: +

      +
    • +Chain 4: This mode is used for MCGA emulation in the 320x200 256-color +mode. The address is mapped to memory MOD 4 (shifted right 2 places.)
    • +
    +<More to be added here.> + +

    Manipulating Display Memory +
            The VGA hardware contains +hardware that can perform bit manipulation on data and allow the host to +operate on all four display planes in a single operation. These features +are fairly straightforward, yet complicated enough that most VGA programmers +choose to ignore them. This is unfortunate, as properly utilization of +these registers is crucial to programming the VGA's 16 color modes. Also, +knowledge of this functionality can in many cases enhance performance in +other modes including text and 256 color modes. In addition to normal read +and write operations the VGA hardware provides enhanced operations such +as the ability to perform rapid comparisons, to write to multiple planes +simultaneously, and to rapidly move data from one area of display memory +to another, faster logical operations (AND/OR/XOR) as well as bit rotation +and masking. + +

    Reading from Display Memory +
            The VGA hardware has two +read modes, selected by the Read Mode field. +The first is a straightforward read of one or more consecutive bytes (depending +on whether a byte, word or dword operation is used) from one bit plane. +The value of the Read Map Select field is +the page that will be read from. The second read mode returns the result +of a comparison of the display memory and the Color +Compare field and masked by the Color Don't +Care field. This mode which can be used to rapidly perform up to 32 +pixel comparisons in one operation in the planar video modes, helpful for +the implementation of fast flood-fill routines. A read from display memory +also loads a 32 bit latch register, one byte from each plane. This latch +register, is not directly accessible from the host CPU; rather it can be +used as data for the various write operations. The latch register retains +its value until the next read and thus may be used with more than one write +operation. +
           The two read modes, simply called +Read Mode 0-1 based on the value of the Read +Mode field are: +

      +
    • +Read Mode 0:
    • + +
             Read Mode 0 is used to read one +byte from a single plane of display memory. The plane read is the value +of the Read Map Select field. In order to +read a single pixel's value in planar modes, four read operations must +be performed, one for each plane. If more than one bytes worth of data +is being read from the screen it is recommended that you read it a plane +at a time instead of having to perform four I/O operations to the Read +Map Select field for each byte, as this will allow the use of faster +string copy instructions and reduce the number I/O operations performed. +
    • +Read Mode 1:
    • + +
              Read Mode 1 is used to perform +comparisons against a reference color, specified by the Color +Compare field. If a bit is set in the Color +Don't Care field then the corresponding color plane is considered for +by the comparison, otherwise it is ignored. Each bit in the returned result +represents one comparison between the reference color from the Color +Compare field, with the bit being set if the comparison is true. This +mode is mainly used by flood fill algorithms that fill an area of a specific +color, as it requires 1/4 the number of reads to determine the area that +needs to be filled in addition to the additional work done by the comparison. +Also an efficient "search and replace" operation that replaces one color +with another can be performed when this mode is combined with Write Mode +3.
    +Writing to Display Memory +
            The VGA has four write modes, +selected by the Write Mode field. This controls +how the write operation and host data affect the display memory. The VGA, +depending on the Write Mode field performs +up to five distinct operations before the write affects display memory. +Note that not all write modes use all of pipelined stages in the write +hardware, and others use some of the pipelined stages in different ways. +
            The first of these allows +the VGA hardware to perform a bitwise rotation on the data written from +the host. This is accomplished via a barrel rotator that rotates the bits +to the right by the number of positions specified by the Rotate +Count field. This performs the same operation as the 8086 ROR instruction, +shifting bits to the right (from bit 7 towards bit 0.) with the bit shifted +out of position 0 being "rolled" into position 7. Note that if the rotate +count field is zero then no rotation is performed. +
            The second uses the Enable +Set/Reset and Set/Reset fields. These +fields can provide an additional data source in addition to the data written +and the latched value from the last read operation performed. Normally, +data from the host is replicated four times, one for each plane. In this +stage, a 1 bit in the Enable Set/Reset field +will cause the corresponding bit plane to be replaced by the bit value +in the corresponding Set/Reset field location, +replicated 8 times to fill the byte, giving it either the value 00000000b +or 11111111b. If the Enable Set/Reset field +for a given plane is 0 then the host data byte is used instead. Note that +in some write modes, the host data byte is used for other purposes, and +the set/reset register is always used as data, and in other modes the set/reset +mechanism is not used at all. +
          The third stage performs logical operations +between the host data, which has been split into four planes and is now +32-bits wide, and the latch register, which provides a second 32-bit operand. +The Logical Operation field selects the operation +that this stage performs. The four possibilities are: NOP (the host data +is passed directly through, performing no operation), AND (the data is +logically ANDed with the latched data.), OR (the data is logically ORed +with the latched data), and XOR (the data is logically XORed with the latched +data.) The result of this operation is then passed on. whilst the latched +data remains unchanged, available for use in successive operations. +
            In the fourth stage, individual +bits may be selected from the result or copied from the latch register. +Each bit of the Bit Mask field determines +whether the corresponding bits in each plane are the result of the previous +step or are copied directly from the latch register. This allows the host +CPU to modify only a single bit, by first performing a dummy read to fill +the latch register +
            The fifth stage allows specification +of what planes, if any a write operation affects, via the Memory +Plane Write Enable field. The four bits in this field determine whether +or not the write affects the corresponding plane If the a planes bit is +1 then the data from the previous step will be written to display memory, +otherwise the display buffer location in that plane will remain unchanged. +
            The four write modes, of +which the current one is set by writing to the Write +Mode field The four write modes, simply called write modes 0-3, based +on the value of the Write Mode field are: +
      +
    • +Write Mode 0:
    • + +
              Write Mode 0 is the standard +and most general write mode. While the other write modes are designed to +perform a specific task, this mode can be used to perform most tasks as +all five operations are performed on the data. The data byte from the host +is first rotated as specified by the Rotate Count +field, then is replicated across all four planes. Then the Enable +Set/Reset field selects which planes will receive their values from +the host data and which will receive their data from that plane's Set/Reset +field location. Then the operation specified by the Logical +Operation field is performed on the resulting data and the data in +the read latches. The Bit Mask field is then +used to select between the resulting data and data from the latch register. +Finally, the resulting data is written to the display memory planes enabled +in the Memory Plane Write Enable field. +
    • +Write Mode 1:
    • + +
              Write Mode 1 is used to +transfer the data in the latches register directly to the screen, affected +only by the Memory Plane Write Enable field. +This can facilitate rapid transfer of data on byte boundaries from one +area of video memory to another or filling areas of the display with a +pattern of 8 pixels. When Write Mode 0 is used with the Bit +Mask field set to 00000000b the operation of the hardware is identical +to this mode, although it is entirely possible that this mode is faster +on some cards. +
    • +Write Mode 2:
    • + +
              Write Mode 2 is used to +unpack a pixel value packed into the lower 4 bits of the host data byte +into the 4 display planes. In the byte from the host, the bit representing +each plane will be replicated across all 8 bits of the corresponding planes. +Then the operation specified by the Logical Operation +field is performed on the resulting data and the data in the read latches. +The Bit Mask field is then used to select +between the resulting data and data from the latch register. Finally, the +resulting data is written to the display memory planes enabled in the Memory +Plane Write Enable field. +
    • +Write Mode 3:
    • + +
              Write Mode 3 is used +when the color written is fairly constant but the Bit +Mask field needs to be changed frequently, such as when drawing single +color lines or text. The value of the Set/Reset +field is expanded as if the Enable Set/Reset +field were set to 1111b, regardless of its actual value. The host data +is first rotated as specified by the Rotate Count +field, then is ANDed with the Bit Mask field. +The resulting value is used where the Bit Mask +field normally would be used, selecting data from either the expansion +of the Set/Reset field or the latch register. +Finally, the resulting data is written to the display memory planes enabled +in the Memory Plane Write Enable field.
    +Notice: All trademarks used or referred to on this page are the property +of their respective owners. +
    All pages are Copyright © 1997, 1998, J. D. Neal, except where +noted. Permission for utilization and distribution is subject to the terms +of the FreeVGA Project Copyright License. +
      +
      + + diff --git a/specs/freevga/vga/vgareg.htm b/specs/freevga/vga/vgareg.htm new file mode 100644 index 0000000..45d3162 --- /dev/null +++ b/specs/freevga/vga/vgareg.htm @@ -0,0 +1,508 @@ + + + + + + + VGA/SVGA Video Programming--Accessing the VGA Registers + + + +
    Home Intro Advice +Fudge Paranoia External +Indexed Attribute Color +Binary Example Masking +Back  +
    Hardware Level VGA and SVGA Video Programming Information +Page
    + +
    Accessing the VGA Registers  +
    + + +Introduction +
            This section discusses methods +of manipulating the particular registers present in VGA hardware. Depending +upon which register one is accessing, the method of accessing them is different +and sometimes difficult to understand. The VGA has many more registers +than it has I/O ports, thus it must provide a way to re-use or multiplex +many registers onto a relatively small number of ports. All of the VGA +ports are accessed by inputting and outputting bytes to I/O ports; however, +in many cases it is necessary to perform additional steps to ready the +VGA adapter for reading and writing data. Port addresses are given at their +hexadecimal address, such as 3C2h. + +

    General Advice +
            If a program takes +control of the video card and changes its state, it is considered good +programming practice to keep track of the original values of any register +it changes such that upon termination (normal or abnormal) it can write +them back to the hardware to restore the state. Anyone who has seen a graphics +application abort in the middle of a graphics screen knows how annoying +this can be. Almost all of the VGA registers can be saved and restored +in this fashion. In addition when changing only a particular field of a +register, the value of the register should be read and the byte should +be masked so that only the field one is trying to change is actually changed. + +

    I/O Fudge Factor +
            Often a hardware device +is not capable handling I/O accesses as fast as the processor can issue +them. In this case, a program must provide adequate delay between I/O accesses +to the same device. While many modern chipsets provide this delay in hardware, +there are still many implementations in existence that do not provide this +delay. If you are attempting to write programs for the largest possible +variety of hardware configurations, then it is necessary to know the amount +of delay necessary. Unfortunately, this delay is not often specified, and +varies from one VGA implementation to another. In the interest of performance +it is ideal to keep this delay to the minimum necessary. In the interest +of compatibility it is necessary to implement a delay independent of clock +speed. (Faster processors are continuously being developed, and also a +user may change clock speed dynamically via the Turbo button on their case.) + +

    Paranoia +
            If one wishes to be extra +cautious when writing to registers, after writing to a register one can +read the value back and compare it with the original value. If they differ +it may mean that the VGA hardware has a stuck bit in one its registers, +that you are attempting to modify a locked or unsupported register, or +that you are not providing enough delay between I/O accesses. As long as +reading the register twice doesn't have any unintended side effects, when +reading a registers value, one can read the register twice and compare +the values read, after masking out any fields that may change without CPU +intervention. If the values read back are different it may mean that you +are not providing enough delay between I/O accesses, that the hardware +is malfunctioning, or are reading the wrong register or field. Other problems +that these techniques can address are noise on the I/O bus due to faulty +hardware, dirty contacts, or even sunspots! When perform I/O operations +and these checks fail, try repeating the operation, possibly with increased +I/O delay time. By providing extra robustness, I have found that my own +programs will work properly on hardware that causes less robust programs +to fail. + +

    Accessing the External Registers +
            The external registers are +the easiest to program, because they each have their own separate I/O address. +Reading and writing to them is as simple as inputting and outputting bytes +to their respective port address. Note, however some, such as the Miscellaneous +Output Register is written at port 3C2h, but is read at port 3CCh. The +reason for this is for backwards compatibility with the EGA and previous +adapters. Many registers in the EGA were write only, and thus the designers +placed read-only registers at the same location as write-only ones. However, +the biggest complaint programmers had with the EGA was the inability to +read the EGA's video state and thus in the design of the VGA most of these +write-only registers were changed to read/write registers. However, for +backwards compatibility, the read-only register had to remain at 3C2h, +so they used a different port. + +

    Accessing the Sequencer, Graphics, and CRT +Controller Registers +
            These registers are accessed +in an indexed fashion. Each of the three have two unique read/write ports +assigned to them. The first port is the Address Register for the group. +The other is the Data Register for the group. By writing a byte to the +Address Register equal to the index of the particular sub-register you +wish to access, one can address the data pointed to by that index by reading +and writing the Data Register. The current value of the index can be read +by reading the Address Register. It is best to save this value and restore +it after writing data, particularly so in an interrupt routine because +the interrupted process may be in the middle of writing to the same register +when the interrupt occurred. To read and write a data register in one of +these register groups perform the following procedure: +

      +
    1. +Input the value of the Address Register and save it for step 6
    2. + +
    3. +Output the index of the desired Data Register to the Address Register.
    4. + +
    5. +Read the value of the Data Register and save it for later restoration upon +termination, if needed.
    6. + +
    7. +If writing, modify the value read in step 3, making sure to mask off bits +not being modified.
    8. + +
    9. +If writing, write the new value from step 4 to the Data register.
    10. + +
    11. +Write the value of Address register saved in step 1 to the Address Register.
    12. +
    +        If you are paranoid, then you +might want to read back and compare the bytes written in step 2, 5, and +6 as in the Paranoia section above. Note that certain +CRTC registers can be protected from read or write access for compatibility +with programs written prior to the VGA's existence. This protection is +controlled via the Enable Vertical Retrace Access +and CRTC Registers Protect Enable fields. +Ensuring that access is not prevented even if your card does not normally +protect these registers makes your + +

    Accessing the Attribute Registers +
             The attribute registers +are also accessed in an indexed fashion, albeit in a more confusing way. +The address register is read and written via port 3C0h. The data register +is written to port 3C0h and read from port 3C1h. The index and the data +are written to the same port, one after another. A flip-flop inside the +card keeps track of whether the next write will be handled is an index +or data. Because there is no standard method of determining the state of +this flip-flop, the ability to reset the flip-flop such that the next write +will be handled as an index is provided. This is accomplished by reading +the Input Status #1 Register (normally port 3DAh) (the data received is +not important.) This can cause problems with interrupts because there is +no standard way to find out what the state of the flip-flop is; therefore +interrupt routines require special card when reading this register. (Especially +since the Input Status #1 Register's purpose is to determine whether a +horizontal or vertical retrace is in progress, something likely to be read +by an interrupt routine that deals with the display.) If an interrupt were +to read 3DAh in the middle of writing to an address/data pair, then the +flip-flop would be reset and the data would be written to the address register +instead. Any further writes would also be handled incorrectly and thus +major corruption of the registers could occur. To read and write an data +register in the attribute register group, perform the following procedure: +

      +
    1. +Input a value from the Input Status #1 Register (normally port 3DAh) and +discard it.
    2. + +
    3. +Read the value of the Address/Data Register and save it for step 7.
    4. + +
    5. +Output the index of the desired Data Register to the Address/Data Register
    6. + +
    7. +Read the value of the Data Register and save it for later restoration upon +termination, if needed.
    8. + +
    9. +If writing, modify the value read in step 4, making sure to mask off bits +not being modified.
    10. + +
    11. +If writing, write the new value from step 5 to the Address/Data register.
    12. + +
    13. +Write the value of Address register saved in step 1 to the Address/Data +Register.
    14. + +
    15. +If you wish to leave the register waiting for an index, input a value from +the Input Status #1 Register (normally port 3DAh) and discard it.
    16. +
    +        If you have control over interrupts, +then you can disable interrupts while in the middle of writing to the register. +If not, then you may be able to implement a critical section where you +use a byte in memory as a flag whether it is safe to modify the attribute +registers and have your interrupt routine honor this. And again, it pays +to be paranoid. Resetting the flip-flop even though it should be +in the reset state already helps prevent catastrophic problems. Also, you +might want to read back and compare the bytes written in step 3, 6, and +7 as in the Paranoia section above. +
            On the IBM VGA implementation, +an undocumented register (CRTC Index=24h, bit 7) can be read to determine +the status of the flip-flop (0=address,1=data) and many VGA compatible +chipsets duplicate this behavior, but it is not guaranteed. However, it +is a simple matter to determine if this is the case. Also, some SVGA chipsets +provide the ability to access the attribute registers in the same fashion +as the CRT, Sequencer, and Graphics controllers. Because this functionality +is vendor specific it is really only useful when programming for that particular +chipset. To determine if this undocumented bit is supported, perform the +following procedure: +
      +
    1. +Input a value from the Input Status #1 Register (normally port 3DAh) and +discard it.
    2. + +
    3. +Verify that the flip-flop status bit (CRTC Index 24, bit 7) is 0. If bit=1 +then feature is not supported, else continue to step 3.
    4. + +
    5. +Output an address value to the Attribute Address/Data register.
    6. + +
    7. +Verify that the flip-flop status bit (CRTC Index 24, bit 7) is 1. If bit=0 +then feature is not supported, else continue to step 5.
    8. + +
    9. +Input a value from the Input Status #1 Register (normally port 3DAh) and +discard it.
    10. + +
    11. +Verify that the flip-flop status bit (CRTC Index 24, bit 7) is 0. If bit=1 +then feature is not supported, else feature is supported.
    12. +
    +Accessing the Color Registers +
         The color registers require an altogether +different technique; this is because the 256-color palette requires 3 bytes +to store 18-bit color values. In addition the hardware supports the capability +to load all or portions of the palette rapidly. To write to the palette, +first you must output the value of the palette entry to the PEL Address +Write Mode Register (port 3C8h.) Then you should output the component values +to the PEL Data Register (port 3C9h), in the order red, green, then blue. +The PEL Address Write Mode Register will then automatically increment, +allowing the component values of the palette entry to be written to the +PEL Data Register. Reading is performed similarly, except that the PEL +Address Read Mode Register (port 3C7h) is used to specify the palette entry +to be read, and the values are read from the PEL Data Register. Again, +the PEL Address Read Mode Register auto-increments after each triplet is +written. The current index for the current operation can be read from the +PEL Address Write Mode Register. Reading port 3C7h gives the DAC State +Register, which specifies whether a read operation or a write operation +is in effect. As in the attribute registers, there is guaranteed way for +an interrupt routine to access the color registers and return the color +registers to the state they were in prior to access without some communication +between the ISR and the main program. For some workarounds see the Accessing +the Attribute Registers section above. To read the color registers: +
      +
    1. +Read the DAC State Register and save the value for use in step 8.
    2. + +
    3. +Read the PEL Address Write Mode Register for use in step 8.
    4. + +
    5. +Output the value of the first color entry to be read to the PEL Address +Read Mode Register.
    6. + +
    7. +Read the PEL Data Register to obtain the red component value.
    8. + +
    9. +Read the PEL Data Register to obtain the green component value.
    10. + +
    11. +Read the PEL Data Register to obtain the blue component value.
    12. + +
    13. +If more colors are to be read, repeat steps 4-6.
    14. + +
    15. +Based upon the DAC State from step 1, write the value saved in step 2 to +either the PEL Address Write Mode Register or the PEL Address Read Mode +Register.
    16. +
    +Note: Steps 1, 2, and 8 are hopelessly optimistic. This in no way guarantees +that the state is preserved, and with some DAC implementations this may +actually guarantee that the state is never preserved. See the DAC +Operation page for more details. + +

    Binary Operations +
            In order to better +understand dealing with bit fields it is necessary to know a little bit +about logical operations such as logical-and (AND), logical-or (OR), and +exclusive-or(XOR.) These operations are performed on a bit by bit basis +using the truth tables below. All of these operations are commutative, +i.e. A OR B = B OR A, so you look up one bit in the left column and the +other in the top row and consult the intersecting row and column for the +answer. +
      +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ANDORXOR
    010101
    000001001
    101111110
    +
    +Example Register +
            The following table is an +example of one particular register, the Mode Register of the Graphics Register. +Each number from 7-0 represents the bit position in the byte. Many registers +contain more than one field, each of which performs a different function. +This particular chart contains four fields, two of which are two bits in +length. It also contains two bits which are not implemented (to the best +of my knowledge) by the standard VGA hardware. +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Mode Register (Index 05h)
    76543210
    Shift RegisterOdd/EvenRMWrite Mode
    +
    +Masking Bit-Fields +
            Your development environment +may provide some assistance in dealing with bit fields. Consult your documentation +for this. In addition it can be performed using the logical operators AND, +OR, and XOR (for details on these operators see the Binary +Operations section above.) To change the value of the Shift Register +field of the example register above, we would first mask out the bits we +do not wish to change. This is accomplished by performing a logical AND +of the value read from the register and a binary value in which all of +the bits we wish to leave alone are set to 1, which would be 10011111b +for our example. This leaves all of the bits except the Shift Register +field alone and set the Shift Register field to zero. If this was our goal, +then we would stop here and write the value back to the register. We then +OR the value with a binary number in which the bits are shifted into position. +To set this field to 10b we would OR the result of the AND with 01000000b. +The resulting byte would then be written to the register. To set a bitfield +to all ones the AND step is not necessary, similar to setting the bitfield +to all zeros using AND. To toggle a bitfield you can XOR a value with a +byte with a ones in the positions to toggle. For example XORing the value +read with 01100000b would toggle the value of the Shift Register bitfield. +By using these techniques you can assure that you do not cause any unwanted +"side-effects" when modifying registers. + +

    Notice: All trademarks used or referred to on this page are the property +of their respective owners. +
    All pages are Copyright © 1997, 1998, J. D. Neal, except where +noted. Permission for utilization and distribution is subject to the terms +of the FreeVGA Project Copyright License. +
      +
      + + diff --git a/specs/freevga/vga/vgargidx.htm b/specs/freevga/vga/vgargidx.htm new file mode 100644 index 0000000..6fc4712 --- /dev/null +++ b/specs/freevga/vga/vgargidx.htm @@ -0,0 +1,385 @@ + + + + + + + VGA/SVGA Video Programming--VGA Field Index + + + +

    Home 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 Back  +
    Hardware Level VGA and SVGA Video Programming Information +Page
    + +
    VGA Field Index  +
    + +
    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
    + + + + +

    Notice: All trademarks used or referred to on this page are the property +of their respective owners. +
    All pages are Copyright © 1997, 1998, J. D. Neal, except where +noted. Permission for utilization and distribution is subject to the terms +of the FreeVGA Project Copyright License. +
      +
      + + diff --git a/specs/freevga/vga/vgaseq.htm b/specs/freevga/vga/vgaseq.htm new file mode 100644 index 0000000..9818979 --- /dev/null +++ b/specs/freevga/vga/vgaseq.htm @@ -0,0 +1,206 @@ + + + + + + + FreeVGA - VGA Sequencer Operation + + + +

    Home Back  +
    Hardware Level VGA and SVGA Video Programming Information Page
    + +
    VGA Sequencer Operation  +
    +Introduction +
            The sequencer portion of +the VGA hardware reads the display memory and converts it into data that +is sent to the attribute controller.  This would normally be a simple +part of the video hardware, but the VGA hardware was designed to provide +a degree of software compatibility with monochrome, CGA, EGA, and MCGA +adapters.  For this reason, the sequencer has quite a few different +modes of operation.  Further complicating programming, the sequencer +has been poorly documented, resulting in many variances between various +VGA/SVGA implementations. +
      +
    Sequencer Memory Addressing +
            The sequencer operates by +loading a display address into memory, then shifting it out pixel by pixel.   +The memory is organized internally as 64K addresses, 32 bits wide.  +The seqencer maintains an internal 16-bit counter that is used to calculate +the actual index of the 32-bit location to be loaded and shifted out.  +There are several different mappings from this counter to actual memory +addressing, some of which use other bits from other counters, as required +to provide compatibility with older hardware that uses those addressing +schemes. + +

    <More to be added here> +
      +
    Graphics Shifting Modes +
            When the Alphanumeric +Mode Disable field is set to 1, the sequencer operates in graphics +mode where data in memory references pixel values, as opposed to the character +map based operation used for alphanumeric mode. +
            The sequencer has three +methods of taking the 32-bit memory location loaded and shifting it into +4-bit pixel values suitable for graphics modes, one of which combines 2 +pixel values to form 8-bit pixel values.  The first method is the +one used for the VGA's 16 color modes.  This mode is selected when +both the 256-Color Shift Mode and Shift +Register Interleave Mode fields are set to 0.  In this mode, one +bit from each of the four 8-bit planes in the 32-bit memory is used to +form a 16 color value. This is shown in the diagram below, where the most +significant bit of each of the four planes is shifted out into a pixel +value, which is then sent to the attribute controller to be converted into +an index into the DAC palette.  Following this, the remaining bits +will be shifted out one bit at a time, from most to least significant bit, +with the bits from planes 0-3 going to pixel bits 0-3. +
      +
      +

    Click here for Textified Planar Shift Mode Diagram
    +  + +

            The second shift mode is +the packed shift mode, which is selected when both the 256-Color +Shift Mode field is set to 0 and the Shift +Register Interleave Mode field is set to 1.This is used by the VGA +bios to support video modes compatible with CGA video modes.  However, +the CGA only uses planes 0 and 1 providing for a 4 color packed mode; however, +the VGA hardware actually uses bits from two different bit planes, providing +for 16 color modes.  The bits for the first four pixels shifted out +for a given address are stored in planes 0 and 2.  The second four +are stored in planes 1 and 3.  For each pixel, bits 3-2 are shifted +out of the higher numbered plane and bits 1-0 are shifted out of the lower +numbered plane.  For example, bits 3-2 of the first pixel shifted +out are located in bits 7-6 of plane 2; likewise, bits 1-0 of the same +pixel are located in bits 7-6 of plane 0. +
      +
      +

    Click for Textified Packed Shift Mode Diagram
    +  + +

           The third shift mode is used for +256-color modes, which is selected when the 256-Color +Shift Mode field is set to 1 (this field takes precedence over the +Shift Register Interleave Mode field.)  +This behavior of this shift mode varies among VGA implementations, due +to it normally being used in combination with the 8-bit +Color Enable field of the attribute controller.  Thus certain +variances in the sequencing operations can be masked by similar variances +in the attribute controller.  However, the implementations I have +experimented with seem to fall into one of two similar behaviors, and thus +it is possible to describe both here.  Note that one is essentially +a mirror image of the other, leading me to believe that the designers knew +how it should work to be 100% IBM VGA compatible, but managed to get it +backwards in the actual implementation. Due to being very poorly documented +and understood, it is very possible that there are other implementations +that vary significantly from these two cases.  I do, however, feel +that attempting to specify each field's function as accurately possible +can allow more powerful utilization of the hardware. +
            When this shift mode is +enabled, the VGA hardware shifts 4 bit pixel values out of the 32-bit memory +location each dot clock.  This 4-bit value is processed by the attribute +controller, and the lower 4 bits of the resulting DAC index is combined +with the lower 4 bits of the previous attribute lookup to produce an 8-bit +index into the DAC palette.  This is why, for example, a 320 pixel +wide 256 color mode needs to be programmed with timing values for a 640 +pixel wide normal mode.  In 256-color mode, each plane holds a 8-bit +value which is intended to be the DAC palette index for that pixel.  +Every second 8-bit index generated should correspond to the values in planes +0-3, appearing left to right on the display.  This is masked by the +attribute controller, which in 256 color mode latches every second 8-bit +value as well.  This means that the intermediate 8-bit values are +not normally seen, and is where implementations can vary.  Another +variance is whether the even or odd pixel values generated are the intended +data bytes.  This also is masked by the attribute controller, which +latches the appropriate even or odd pixel values. +
            The first case is where +the 8-bit values are formed by shifting the 4 8-bit planes left.  +This is shown in the diagram below.  The first pixel value generated +will be the value held in bits 7-4 of plane 0, which is then followed by +bits 3-0 of plane 0.  This continues, shifting out the upper four +bits of each plane in sequence before the lower four bits, ending up with +bits 3-0 of plane 3.  Each pixel value is fed to the attribute controller, +where a lookup operation is performed using the attribute table.  +The previous 8-bit DAC index is shifted left by four, moving from the lower +four bits to the upper four bits of the DAC index, and the lower 4 bits +of the attribute table entry for the current pixel is shifted into the +lower 4 bits of the 8-bit value, producing a new 8-bit DAC index.  +Note how one 4-bit result carries over into the next display memory location +sequenced. +
            For example, assume planes +0-3 hold 01h, 23h, 45h, and 67h respectively, and the lower 4 bits of the +the attribute table entries hold the value of the index itself, essentially +using the index value as the result, and the last 8-bit DAC index generated +was FEh. The first cycle, the pixel value generated is 0h, which is fed +to the attribute controller and looked up, producing the table entry 0h +(surprise!) The previous DAC index, FEh, is shifted left by four bits, +while the new value, 0h is shifted into the lower four bits.  Thus, +the new DAC index output for this pixel is E0h.  The next pixel is +1h, which produces 1h at the other end of the attribute controller.  +The previous DAC index, E0h is shifted again producing 01h.  This +process continues, producing the DAC indexes, in order, 12h, 23h, 34h, +45h, 56h, and 67h.  Note that every second DAC index is the appropriate +8-bit value for a 256-color mode, while the values in between contain four +bits of the previous and four bits of the next DAC index. +
      +
      +

    Click for Textified 256-Color Shift Mode Diagram (Left)
    +  + +

           The second case is where the 8-bit +values are formed by shifting the 8-bit values right, as depicted in the +diagram below.  The first pixel value generated is the lower four +bits of plane 0, followed by the upper four bits.  This continues +for planes 1-3 until the last pixel value produced, which is the upper +four bits of Plane 3.  These pixel values are fed to the attribute +controller, where the corresponding entry in the attribute table is looked +up.  The previous 8-bit DAC index is shifted right 4 places. and the +lower four bits of the attribute table entry generated is used as the upper +four bits of the new DAC index. +
            For example, assume planes +0-3 hold 01h, 23h, 45h, and 67h respectively, and the lower 4 bits of the +the attribute table entries hold the value of the index itself, essentially +using the index value as the result, and the last 8-bit DAC index generated +was FEh. The first cycle, the pixel value generated is 1h, which is fed +to the attribute controller and looked up, producing the table entry 1h. +The previous DAC index, FEh, is shifted right by four bits, while the new +value, 1h is shifted into the upper four bits.  Thus, the new DAC +index output for this pixel is 1Fh.  The next pixel is 0h, which produces +0h at the other end of the attribute controller.  The previous DAC +index, 1Fh is shifted again producing 01h.  This process continues, +producing the DAC indexes, in order, 30h, 23h, 52h, 45h, 74h, and 67h.  +Again, note that every second DAC index is the appropriate 8-bit value +for a 256-color mode, while the values in between contain four bits of +the previous and four bits of the next DAC index. +
      +
      +

    Click for Textified 256-Color Shift Mode Diagram (Right)
    +  +
      +
            Another variance that can +exist is whether the first or second DAC index generated at the beginning +of a scan line is the appropriate 8-bit value.  If it is the second, +the first DAC index contains 4 bits from the contents of the DAC index +prior to the start of the scan line.  This could conceivably contain +any value, as it is normally masked by the attribute controller when in +256-color mode whcih would latch the odd pixel values.  Likely this +value will be either 00h or whatever the contents were at the end of the +previous scan line.  A similar circumstance arises where the last +pixel value generated falls on a boundary between memory addresses.  +In this circumstance, however, the value generated is produced by sequencing +the next display memory address as if the line continued, and is thus more +predictable. +
      + +

    Notice: All trademarks used or referred to on this page are the property +of their respective owners. +
    All pages are Copyright © 1997, 1998, J. D. Neal, except where +noted. Permission for utilization and distribution is subject to the terms +of the FreeVGA Project Copyright License. +
      +
      +
      + + diff --git a/specs/freevga/vga/vgatext.htm b/specs/freevga/vga/vgatext.htm new file mode 100644 index 0000000..a2e34a0 --- /dev/null +++ b/specs/freevga/vga/vgatext.htm @@ -0,0 +1,185 @@ + + + + + + + VGA/SVGA Video Programming--VGA Text Mode Operation + + + +

    Home Intro Memory +Attributes Fonts Cursor +Back  +
    Hardware Level VGA and SVGA Video Programming Information +Page
    + +
    VGA Text Mode Operation  +
    + +
      +
    • +Introduction -- gives scope of this page.
    • + +
    • +Display Memory Organization -- details how the VGA's +planes are utilized when in text mode.
    • + +
    • +Attributes -- details the fields of the attribute +byte.
    • + +
    • +Fonts -- details the operation of the character generation +hardware.
    • + +
    • +Cursor -- details on manipulating the text-mode cursor.
    • +
    +Introduction +
            This section is intended +to document the VGA's operation when it is in the text modes, including +attributes and fonts. While it would seem that the text modes are adequately +supported by the VGA BIOS, there is actually much that can be done with +the VGA text modes that can only be accomplished by going directly to the +hardware. Furthermore, I have found no good reference on the VGA text modes; +most VGA references take them for granted without delving into their operation. + +

    Display Memory Organization +
            The four display memory +planes are used for different purposes when the VGA is in text mode. Each +byte in plane 0 is used to store an index into the character font map. +The corresponding byte in plane 1 is used to specify the attributes of +the character possibly including color, font select, blink, underline and +reverse. For more details on attribute operation see the Attributes section +below. Display plane 2 is used to store the bitmaps for the characters +themselves. This is discussed in the Fonts section below. Normally, the +odd/even read and write addressing mode is used to make planes 0 and 1 +accessible at interleaved host memory addresses. + +

    Attributes +
            The attribute byte is divided +into two four bit fields. The field from 7-4 is used as an index into the +palette registers for the background color which used when a font bit is +0. The field from 3-0 is used as an index into the palette registers for +the foreground which is used when a font bit is 1. Also the attribute can +control several other aspects which may modify the way the character is +displayed. +
            If the Blink +Enable field is set to 1, character blinking is enabled. When blinking +is enabled, bit 3 of the background color is forced to 0 for attribute +generation purposes, and if bit 7 of the attribute byte for a character +is set to 1, the foreground color alternates between the foreground and +background, causing the character to blink. The blink rate is determined +by the vertical sync rate divided by 32. +
            If the bits 2-0 of the attribute +byte is equal to 001b and bits 6-4 of the attribute byte is equal to 000b, +then the line of the character specified by the Underline +Location field is replaced with the foreground color. Note if the line +specified by the Underline Location field +is not normally displayed because it is greater than the maximum scan line +of the characters displayed, then the underline capability is effectively +disabled. +
            Bit 3 of the attribute byte, +as well as selecting the foreground color for its corresponding character, +also is used to select between the two possible character sets (see Fonts +below.) If both character sets are the same, then the bit effectively functions +only to select the foreground color. + +

    Fonts +
            The VGA's text-mode hardware +provides for a very fast text mode. While this mode is not used as often +these days, it used to be the predominant mode of operation for applications. +The reason that the text mode was fast, much faster than a graphics mode +at the same resolution was that in text mode, the screen is partitioned +into characters. A single character/attribute pair is written to screen, +and the hardware uses a font table in video memory to map those character +and attribute pairs into video output, as opposed to having to write all +of the bits in a character, which could take over 16 operations to write +to screen. As CPU display memory bandwidth is somewhat limited (particularly +on on older cards), this made text mode the mode of choice for applications +which did not require graphics. + +

             For each character +position, bit 3 of the attribute byte selects which character set is used, +and the character byte selects which of the 256 characters in that font +are used. Up to eight sets of font bitmaps can be stored simultaneously +in display memory plane 2. The VGA's hardware provides for two banks of +256 character bitmaps to displayed simultaneously. Two fields, Character +Set A Select and Character Set B Select +field are used to determine which of the eight font bitmaps are currently +displayed. If bit 3 of a character's attribute byte is set to 1, then the +character set selected by Character Set A Select +field, otherwise the character set specified by Character +Set B Select field is used. Ordinarily, both character sets use the +same map in memory, as utilizing 2 different character sets causes character +set A to be limited to colors 0-7, and character set B to be limited to +colors 8-15. +
            Fonts are either 8 or 9 +pixels wide and can be from 1 to 32 pixels high. The width is determined +by the 9/8 Dot Mode field. Characters normally +have a line of blank pixels to the right and bottom of the character to +separate the character from its neighbor. Normally this is included in +the character's bitmap, leaving only 7 bit columns for the character. Characters +such as the capital M have to be squished to fit this, and would look better +if all 8 pixels in the bitmap could be used, as in 9 Dot mode where the +characters have an extra ninth bit in width, which is displayed in the +text background color, However, this causes the line drawing characters +to be discontinuous due to the blank column. Fortunately, the Line +Graphics Enable field can be set to allow character codes C0h-DFh to +have their ninth column be identical to their eighth column, providing +for continuity between line drawing characters. The height is determined +by the Maximum Scan Line field which is set +to one less than the number of scan lines in the character. +
            Display memory plane 2 is +divided up into eight 8K banks of characters, each of which holds 256 character +bitmaps. Each character is on a 32 byte boundary and is 32 bytes long. +The offset in plane 2 of a character within a bank is determined by taking +the character's value and multiplying it by 32. The first byte at this +offset contains the 8 pixels of the top scan line of the characters. Each +successive byte contains another scan line's worth of pixels. The best +way to read and write fonts to display memory, assuming familiarity with +the information from the Accessing the Display Memory +page, is to use standard (not Odd/Even) addressing and Read Mode 0 and +Write Mode 0 with plane 2 selected for read or write. +
            The following example shows +three possible bitmap representations of text characters. In the left example +an 8x8 character box is used. In this case, the Maximum +Scan Line field is programmed to 7 and the 9/8 +Dot Mode field is programmed to 0. Note that the bottom row and right-most +column is blank. This is used to provide inter-character spacing. The middle +example shows an 8x16 character. In this case the Maximum +Scan Line field is programmed to 15 and the 9/8 +Dot Mode field is programmed to 0. Note that the character has extra +space at the bottom below the baseline of the character. This is used by +characters with parts descending below the baseline, such as the lowercase +letter "g". The right example shows a 9x16 character. In this case the +Maximum Scan Line field is programmed to 15 +and the 9/8 Dot Mode field is programmed to +1. Note that the rightmost column is used by the character, as the ninth +column for 9-bit wide characters is assumed blank (excepting for the behavior +of the the Line Graphics Enable field.) allowing +all eight bits of width to be used to specify the character, instead of +having to devote an entire column for inter-character spacing. +

    Click for Textified Examples of Text Mode Bitmap Characters
    +  + +

      +
    Cursor +
          The VGA has the hardware capability +to display a cursor in the text modes. Further details on the text-mode +cursor's operation can be found in the following section: +

    +Notice: All trademarks used or referred to on this page are the property +of their respective owners. +
    All pages are Copyright © 1997, 1998, J. D. Neal, except where +noted. Permission for utilization and distribution is subject to the terms +of the FreeVGA Project Copyright License. +
      +
      + + diff --git a/specs/freevga/vga/virtual.gif b/specs/freevga/vga/virtual.gif new file mode 100644 index 0000000000000000000000000000000000000000..334d3fc697c2f40203e4e713a4caed49082ded03 GIT binary patch literal 2482 zcmV;j2~GA#Nk%v~VR!)m0q_6-00030|Nkri0001Z0RRC20{@JUsmtvTqnxzbi?iOm z`wxcVNS5Y_rs~SJ?hD8AOxN~}=lag~{tpZahs2`sh)gP%%%<}RjY_A~s`ZM^YPa03 z_X`e-$KZdDOWa&*n}M4x?%CTM3|tBr+x>^md#?SSnZ9hTOy0{J?4S$Z z4(v{z9(mtxS=&eHU^#@`=w*uZFW!2oL7NXBc0mYuIoe%bPA8j+B{?puU7AGZy6u)0;{`3X#6diSN`kVb$J+OiEQ1 zq=h(pUR8%`W=f-2x#C+ILL*6YWr>=d@RM!OS6_3oRU0?&ICS%5RW-Tu?OLKk(QZ&H z*rM0PHScD%DYq|Bq$n8=_Ukur;=o-e8wP>csp5%7kCNV)QX0vYk=Irphq@$W&w^PN zbkFUO$+5~_o?RN$oYy5Xx3`el2iSy;|(s{@0hl?(Iyylw!V8k zC0~sB&?hVFn7ZPf{*fkn?DWwpt&iXS_5312`v3nAV1NP+NML~m9*AIq3NH8`e-5&7 z--8lPNMVH*UWj3a8g9s8haP?iVu&J+NMea5o`_Y8D6Sq1Dt9~Wufyo z+XT2|cx$7$OPDJLxizAj1iN6UOQX9-$m<2XGtyfGzFgQVqrOA$zB| zc=4gX={l@wnXX99j7|lcJ<1RJcizu@zUwXEzwvz0@4FFy)AP4cf7SOxsCC29KfJ#+ z1P?gBNSpM$Cp?xRE@^zC7sDz?HmuRC1`u2u@4jb2=t&S~H1J*ZKG(PKy#m4@e+1^*6DOgUtp4_WxaC_0L3Hgw+*o46~+Q4V?2(H!!8LPQ~M z(Ne@(#eB9=#l5+TJXR#56VX6Bf4NIuV=LnU=NQ4m6b>9RFeC;MnMg*$LXvURV%C6W z$q8a|YyWeRBTIM2rEQRB5nEr8JVzwK<=~UE>m&npc)s>=Z)YYL>x~pwQBxG%R1i5m(N5vgQxpA^5J4@`P%jA6`M5=PEjp?x2I?(`d9tPR zs--f^$s(u9LZs`IYE!Aowyug3qxp0x-xP<%uf{ZEkuqOevkKO#_OhQdoq|>^3Q$?H zbgeJTD-hLM)_0|Esd@zN=Li=1lS%F_f>QjJwa?c>U;yvp(N!MJTL5B0QSHO>--#gk!p zx65BQ@>7ia31M`TIouWl*^7|so^Wd{phjogdw1kcf8^PQ&F9# zByoq83{M{Jml)3wSi?e^Klc6Tq(mcjV{i}mMt7Z5F=R3h<3C`KImvwl8{WIRkNjy z7mw#?sc$}R@E+HvXgcfjX|`OXt!2%@qt$x73Kph!@n-|{64J?a=I(9}ZR}wGI@t-F zHM1kO>?in%)S=+xgn5hXbK2N@dDZk`!*|;@A*|cjWhaWN!x+odiemx+8wi zdcPaqkh4y}tu1PeJNwxR%{Ixqx$%=L+vF;@TgqGh%9q2uk|Upa2N`a20~b8!S*$tF zQIYQRpGPw2Lia4ui{9)nfPA$4PAt|E4rZhqec_cZwA2r|TzWUXu1aTjxvx%a=*D_C zTMwDWU0o50gZ;*0_nWEL-d@)3`|EILyI`Yh^|~(^q}IJQY4xsim|b@8gfG0|56>XL wD}M2eZ@l9l5BbPTe)5#ByyY*C`OIs6^PKOz=RXhn(2IWbq%Zx|3s3+6JDTp^)Bpeg literal 0 HcmV?d00001 diff --git a/specs/freevga/vga/virtual.txt b/specs/freevga/vga/virtual.txt new file mode 100644 index 0000000..055f36a --- /dev/null +++ b/specs/freevga/vga/virtual.txt @@ -0,0 +1,22 @@ + Virtual Screeen Mode Example + ---------------------------- + + 0 319 320 512 + 0 +----------------------------------------+---------------------+ + | | | + | | | + | | | + | | | + | Actual Resolution (Displayed) | | + | 320x200 | | + | | | + | | | + | | | +199 +----------------------------------------+ | +200 | | + | | + | Virtual Resolution (Not Displayed) | + | 512x300 | + | | +299 +--------------------------------------------------------------+ + diff --git a/specs/freevga/vtiming.htm b/specs/freevga/vtiming.htm new file mode 100644 index 0000000..fbbbedd --- /dev/null +++ b/specs/freevga/vtiming.htm @@ -0,0 +1,226 @@ + + + + + + + FreeVGA - Video Timing Information + + + +
    Home Intro Basics +Measurements Horizontal Vertical +Considerations Back  +
    Hardware Level VGA and SVGA Video Programming Information Page
    + +
    Video Timing Information  +
    +Introduction +
           This page is written to give the +necessary background on video timing that is useful for video programming.  +This is not a comprehensive reference on the subject, rather it just gives +the minimum information needed to know to perform mode setting and the +creation of custom video modes.  It includes a small bit of information +about the messy side of video adapters, the electrical output and how that +is interpreted by the monitor.  Much of this information pertains +both to monitors and other CRT devices such as television displays, and +is less applicable to LCD displays as they have different timing requirements. + +

    Basic Description +
            The video hardware produces +a continuous signal on its output connector, except when it is in reset +mode, where the video outputs are held in a single state.  The continuous +signal is required because the pixel information is only displayed for +a short period of time, and relies on the persistence of the phosphor glow +on the monitor as well as the ability of eyesight to perform automatic +averaging to appear to be a steady image.  That signal is usually +output on multiple pins of the monitor connector, although it could also +be a TV compatible output.  LCD displays use a similar technique, +although the timing is more advanced and depends on the specific type of +panel and its driver circuitry.  The signal includes both the pixel +data that the monitor displays, as well as timing and "framing" information +that the video display uses to drive its internal circuitry. +
            The image's pixels are "scanned" +on to the screen from left to right, top to bottom, and is broken up into +"dot periods" or pixels, which is controlled by the "dot clock" for the +mode, which is the basis for all the other video timings.  Each horizontal +"scan line" of dot periods is called a horizontal refresh as it "refreshes" +the information on the display in a horizontal line.  Many of these +scan lines (the amount depending on the video mode), scanning from top +to bottom, make up a vertical refresh, also known as a "frame".  There +are many vertical refreshes per second, where a higher refresh rate produces +an image with less flicker. + +

    Timing Measurements +
            One of the important pieces +of terminology to understand is how timing is measured.  These include +terms such as megahertz, kilohertz, and hertz.  The first three are +a measure of frequency which is based on the term hertz (abbreviated hz), +which can be replaced by the term "Cycles per second."  In video timing, +hertz is used to describe the frequencies of the timing signals, such as +when saying that the vertical refresh frequency is 60 hertz (or 60hz).  +This means that there are 60 cycles per second, which means that there +are 60 vertical refreshes per second.  Another case where hertz is +used is when saying the horizontal refresh rate, such as when saying 31500 +hz, which means that there are 31,500 horizontal refresh cycles per second.  +One abbreviation frequently found is the term kilohertz (abbreviated Khz) +which means 1,000 cycles/per second.  For example, 31.5 kilohertz +means 31.5 x 1000 hertz, or 31500 hz.  This is used to save writing +a few zeros and is a bit more concise.  Similarly the term megahertz +(abbreviated Mhz) is used, which means 1,000,000 cycles/per second.  +For example, instead of saying that a certain mode uses a 25,000,000 hz +dot clock, or saying that it uses a 25,000 Khz clock, it can be concisely +be stated by saying that it uses a 25 Mhz dot clock. +
            Similarly, the periods of +time involved in video timing are very short as they are typically small +fractions of a second.  The terms millisecond, microsecond, and nanosecond +are useful for expressing these small periods of time.  The term millisecond +(abbreviated ms) means one thousandth of a second, or 0.001 seconds.  +In one second, there are 1,000 milliseconds. This is used to describe things, +such as the length of time a vertical refresh takes, for example a 16.6 +millisecond vertical refresh means 16.6 thousands of a second, or 0.0166 +seconds.  In one second, there are 1,000,000 microseconds.  The +term microsecond (abbreviated us) is used to describe something in terms +of millionths of a second, or 0.000001 second.  For example the length +of a horizontal refresh could be 31.7 microseconds, or 31.7 millionths +of a second, 0.0000317 second, or 0.0317 ms.  The term nanosecond +(abbreviated ns) is used to describe one billionth of a second, or 0.000000001 +seconds.  There are 1,000,000,000 nanoseconds in one second.  +One circumstance where this is used, is to describe the period of time +one dot period takes.  For example, one dot period could be stated +as 40 nanoseconds, 0.04 us, 0.00004 ms, or 0.00000004 seconds.  In +each case, the most concise term is used, to provide a shorter, more concise +description. +
            Because the unit hertz is +defined using a unit of time (second), the period of one cycle can be determined +by division.  The simplest example is 1 hz, where the length of the +cycle, by definition would be 1 second. For other values, it can be calculated +according to the following formula: +

      +
    • +Period (in seconds) = 1 / frequency (in hertz)
    • +
    +        For example, a 60 hertz vertical +refresh would last 1 / 60 second, which is approximately 0.0166 seconds, +or 16.6 ms.  Similarly, a 31.5 Khz horizontal refresh would be 1 / +31500 second, which is approximately 0.000031 seconds, or 31.7 us.  +A 25 Mhz dot clock would produce a dot period of 1 / 25000000 second, which +is 0.00000004 seconds, or 40 ns.  If the period of a cycle is known, +then the frequency can be calculated as: +
      +
    • +Frequency (in hertz) = 1 / Period (in seconds).
    • +
    +        For example, a 16.6 ms period +would equate to 1 / 0.0166, which produces a frequency of approximately +60 hz.  Similarly a 31.7 us period would produce approximately a 31.5 +Khz frequency, and a 40 ns period would produce a 25 Mhz frequency. + +

    Horizontal Timing +
            From a monitor's standpoint, +the timing is fairly simple.  It detects the horizontal sync pulses +on the hsync line, then based on the polarity, frequency, and/or duration +of those pulses sets up its horizontal scan circuitry to scan across the +screen at the desired rate.  During this period it continuously displays +the signal input on the analog RGB pins/connectors.  It is important +to to know the horizontal sync frequency ranges of the monitor, as well +as the acceptable width of the sync pulse for those sync ranges.  +If the width of the sync pulse is incorrect, it can make the displayed +information too large or too small, as well as possibly preventing the +monitor from synchronizing to the generated signal.  The acceptable +range of sync pulse width and polarity for a given frequency should be +given in the specifications for the monitor; however, this is frequently +overlooked by the manufacturer.  It is recommended to contact the +manufacturer, otherwise the result has to be determined by trial and error +which can be damaging to the monitor's circuitry. +
            In addition to those that +control horizontal sync frequency and width, there are other horizontal +timing registers which tell the display generation hardware when to output +the active display, when to output the overscan, and when to perform blanking.  +The active display is when pixel data from the frame buffer are being output +and displayed.  This could also be overlaid by data from another source, +such as a TV or MPEG decoder, or a hardware cursor.  The overscan +is the border to the left and right of the screen.  This was more +important on older video hardware such as those monitors lacking horizontal +and vertical picture controls, and is provided for compatibility reasons +although current hardware typically reduces the need for this portion completely.  +The blanking period is used during the retrace portion of the horizontal +display cycle which is the period in which the horizontal sweeps from the +right of the screen back to the left.  Outputting non-zero intensities +during this period would end up being stretched, in reverse across the +end of the current scan line to the beginning of the next scan line which, +while interesting and possibly useful in a small number of circumstances. +would add a bit of blurring to the image.  Blanking is signaled to +the monitor by sending zero intensities of the red, green, and blue components +on the analog lines. +
            In the display generator,  +horizontal timings are specified by the number of dot periods they take.  +The dot period is controlled by selecting the desired dot clock frequency +by programming certain registers. + +

    Vertical Timing +
            Vertical timing is nearly +the same as the horizontal timing, except that it controls the vertical +movement of the display scan, spacing the scan lines the right width apart +so that they seem to form a rectangular image.  The monitor detects +the vertical sync pulses on the vsync line, then based on the polarity, +frequency, and/or duration of those pulses sets up its vertical circuitry +to scan down the screen at the desired rate.  It is necessary to know +the vertical sync frequency ranges for a given monitor, and the range of +acceptable vertical sync widths and polarities for those ranges.  +The rage of vertical sync frequencies supported by the monitor are nearly +always given my the monitor's specifications, but like the horizontal sync +widths, the vertical sync widths are not commonly specified.  Contact +the manufacturer, as attempting to guess the correct vertical sync width +can possibly cause the monitor to fail. +
            As well as being programmed +with the vertical sync frequency and pulse width, the display generation +hardware has other registers which control when to output the active display, +when to output the overscan, and when to perform blanking. In vertical +terms, the active display is the scan lines which contain horizontal active +display periods.  The overscan is the border on top and bottom of +the screen and, if present, consists of one or more entire scan lines in +which the active display period is replaced with the overscan color.  +The blanking is used during the vertical retrace, and consists of one or +more (usually more) scan lines in which the active display and overscan +periods are replaced with blanking period, making the entire line effectively +blanking.  This prevents intensity from overlaying the screen during +the vertical retrace where the monitor sweeps the vertical back to the +top of the screen.  Non-zero intensities output during this period +would be written in a zig-zag pattern from the bottom to the top of the +screen.  In the display generator, the vertical timings are specified +in terms of how many horizontal sync periods they take. +
      +
    Programming Considerations +
            For maximum flexibility, +video timings should be configurable by the end users to allow for the +specifications of their monitor.  However, it is probably a wise idea +to maintain a table of monitors and their rated specifications, to allow +the users to select thieir monitor and determine whether or not the configured +video timings are within the rated specifications of their monitor and +warn the user about this.  There is a distinct need for a comprehensive +and accurate software-usable database of monitor specifications in a platform +and video hardware independent form with sufficient information for a program +to both select timings for a particular video mode, as well as verify that +a given set of timings will function properly on the end-user's hardware.  +This database should contain a human readable description of the monitor +make and model, as well as software parsable fields giving corresponding +ranges of horizontal and vertical frequencies and sync polarities for those +ranges if applicable, as well as a method of determining the acceptable +widths of horizontal and vertical sync pulses for a given frequency in +the corresponding rages.  Framing information could be included in +this table in a frequency independent fashion, although this is something +that can be safely adjusted by the end user without risk of damage to the +monitor, thus it is preferrable to provide a method or interface for the +end-user to adjust these parameters to their preference. +
      + +

    Notice: All trademarks used or referred to on this page are the property +of their respective owners. +
    All pages are Copyright © 1997, 1998, J. D. Neal, except where +noted. Permission for utilization and distribution is subject to the terms +of the FreeVGA Project Copyright License. +
      +
      + + diff --git a/specs/kbd/abnt-keypad.html b/specs/kbd/abnt-keypad.html new file mode 100644 index 0000000..a0224bf --- /dev/null +++ b/specs/kbd/abnt-keypad.html @@ -0,0 +1,88 @@ + + + + ABNT keypad + + +

    ABNT keyboard keypad layout

    +
    Key label and scancode (hex) and Linux keycode (decimal) +for a Brazilian ABNT keyboard keypad.
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Num
    Lock
    / * - 45 e0 45 37 4a 69 98 55 74
    7
    Home
    8
    Up
    9
    PgUp
    + 47 48 49 4e 71 72 73 78
    4
    Left
    5 6
    Right
    . 4b 4c 4d 7e 75 76 77 121
    1
    End
    2
    Down
    3
    PgDn
    Enter 4f 50 51 e0 1c 79 80 81 96
    0
    Ins
    ,
    Del
    52 53 82 83
    + + diff --git a/specs/kbd/amstrad-s.jpg b/specs/kbd/amstrad-s.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cd30a3d2ca2a96cfeb806e1467b76be2bc767bac GIT binary patch literal 17613 zcmbTdbx>Pf^fnp_#ih7QixntPC~hfj@dBl|LvbkX8l*tc;1qAs;>F!1#VJnE5L^>9 zSh&33@6Nq5_pkeXJLjC4GdX9?e)isT*4pcN*2BWXI^dbIyplWs0|NlSc>Dn#&;SE` z{P&;bWVO^kOR(tau;^I1x!XBAvAp3Ecx}$Y^4ZEuf<-`(Ur?N1T!`i6Cp85Y7jq8_ zTNVL6K`s^+4Nvp0b{@Vg(k$YyU$JO9Iy-yV+Bw-g-oM6wSOUBUU_N>B-|^V69*?KE zPoH98J;let!Nw)TCnO}mCm@&1FHyn>>VvZj`{j;@}*frX`& zwT-Qvy}O5}m$#3vU)ZYI^Wk-+V?;esTMUPsJt# zV@Li6?SCQr{|7Ae{|MRt1ML6B1qBddVmwYBCMf_2xZA-ux)9rF2%v>sw<~S<6UngY zt8`v#$1ne6<$;KQE!*^Xh1X5XD1ab}wyf&HF#8Gr0=~~}od|AaduE?`bUv-{JS>1z z@+B)S#)g7-Gw7E&uy{lI#mr6D2-JOfrf|#ODc$;e&eGb684vgxf zKf&q6c0(QlX%ws2)?or%>bEed3 zwG!cT|6~cTreE9t@_1M*ch(s9Em=ZcLjmjA==$44`)QR+(3=rLuSgoPiJ1q0MAy%K zDnIKY%CVKaB{D(AFTC|+Z|0YlDCcY9Vo_i z=h;@Q zNAxhIuIvJFJRNn$d4~9S9iJy}KY6F$2oHlW+&e_J4Ef?MznPBp{tdJ7#vfR=iQ7b? zZ1xP4j|}*Fb@u(6f@KH{_)59EzB|s)D2d0t#Ss%5vCJknvMxZRt2Wd(C$?)^NKX}8 zglCFfkuI?#^;WS{iVFnv)Ye{Y;;^jeuDH)P6}i88cJ>h_s2+HIVx;^=+j6;$QPe1k zeL3})NLk;Q5zZiG$ay6{q1}z#)<%wlM&{fKHL&e{^2En=_MZK!02ZL@l{7$j zW%7kdqxcA{Lvt|IF7YqpO9~G+gav;e=j+akR(1MF?Cz+5SuJin(@{{K!Df!=5v%W; ze6o7B3dw=_AkwzbNu1vzeL~E$NmR_~+u+HFIU{qs^b;C7<$BL=aj2 zHXWV=ZskTjw-cK6h$gVd35fx>XymWX7EF$<&8?PW{M?{O29l5S>ViJlJ6vBLnP z2iYUpTamXf+M^QS06%!H>wtPmzCsyP{JUbg1X8iiC!ozL!eH4&faF#*Byfe!v3k?6KUeF7C#rTiw%)VI+K7n@;v zS5$8AqPTj?3BiAv4?dMe7$x86RImQ~v7fPuve*EA=e?lJ@El1^h%2!Dd#L6EvEOd! zqIXDIU1fu2Cx5Usvq%%RGE>?trNj=e@%-*Bc(f|J?6d3eM(c(Db)gYu(z`xq1~T=F zDg}x%X$kr>piPUu^=kZ%_1WHeB`<3~6dbWK7Cw={u+=GNwy-zjKPTO&c46ey)6FTp zKhTfy%rb7@_q@{4!`$CKJ~luNiJ3&4U*NL&UGo7DRjE#Wr-r0ly9}5p!{(5R&`SWR zpJlFRyoNgg_Rh;&|2b%ldPgIf_k{$q{ z5pC!GVD29+PG#MsGiZ;bpMu0b6nngxj2TNc5wc@;K@lL*lbWE>>Ud9a>_7_LLLW@n zawq1$)n457cHLJ2BSqFM$;sfXt(`vuo_26YBK12EB<~kGv_b)12_Qx1F@aW`5!K

    ~Dlz`G;w;vu!v_g|&i)6B$7L(A`@~ zBM|o$7V;_*IfhvG3ZFoa=)6E)2D_uPv8BJbJ^*Ux5(mEICw=zA`KR$5KN zYtuDb{5{0+DdkC|5Yl@!LBp42?)ODrE`j8a<5q32&b*6RxyyVx^Z@9s;0JqPJOKE+ z;piV-4*+u2FEtK!uRV44ToIt2LMUf1AzG(@&O=a`q;^GF8C3^h3|jNhpY6%Mca6i zA`@YIw;a36)`t16;ES-#KY6tgF?n5Xprayx`@6T3x@f~L7y_zOuV}@J*%q!eG zU5o6%Bt-HcQ5}9Rka{7mYgaT+pf}7pbS<3Ilx8*yf6bYHk5p<_(rlYp>|SCH43F*%jM=ViQvICg@I^X^rk?It60T7{qI4h5g_%arfC)_o0&6I+?5VS+SIUnpSt3LC~?kv{Y;vO>(Wc zbxZBh8B1wmw1c38>LMpTlV{$x-ur=2612F!s0mB_a?XwM2DADK^L^fd3e>_>7X?lW zJq&nUD1;5L&Mpg1H1--?&2$mm_q&jQiR8-|TBf(7_h2wBA<43~4HLcixIDEpfc+{@ z*#a|9ka%bzaX8b_{h_!ES^*5|6Yy~rluNG}0>TyZ>eM4Yg}%b}`_F9~Ty&xIsB97) zTv27<`^=wt8#1|J+l?)E>34SiA8ov^YLoh|ne_P&=YK9MTP8vLJtkz<*10+EGo-|b z)w18rC#}Iv()kB?g_WMH?l7U4=gO6klImYKR(FsP)YQ)47091&!F%Cs1iU!iS0^9E z8)Z(@`(&*9Zoe*Q%!FnfSl7dR(uA7N2li)SGb4|HXi2oNj(XH3J`fIth4lk~?wB1_P_n~p-3&}e&FZ2G%pU+U zO$`2EWI-17%00}UF%eRIxCgV%azR@H2**AEo*4#vl=g`CrhihHpRVM; z>^wPn0E7aUy-ZyP$8Kd%uHZYL=Vi5bScqE|P3zYZgxR_VYh*gAMIMV$W{TKy;}SMY z$cmA!=u4zHcCVG0i>&Ja&zIY-c7BE0TktDHb+5yB8P+&2l(CV%qUG81Tua zppS{0f&3r4h_47j|0uSxqWM$PX>nLAP|8=>S`ir5=&w~qAm@eNp*^YgY|ai z8J+}Uod08*6uaB^*%+Ge0~zIg3H;`tYiI>ivEw}<+ZfSNy4$0}G5i`vgE>Odvw5oa zW||RI8^CFs<|-x9I@-jJDI~ufF3;k<7>Y4b^3nV61;twu;CQi`^q9(^st5CI!SdPn zcHR=UvKXuKT60mw%TXG_&O3~dHl|Nl$haNa0ln!vo|5)cf-GKZ8Z9gQ_syMwjjD$$5t4*G4kiEYZ{SAKYZHNao3bqFk1Xc-#AI@!tcr~mt{ zEX)o}!;;hwYFA>N%riG=b?g|c%*Oq?V`rg@J3)L@@vaIsVe$q=5^zo$OaoX&r@E1* z4h5xjw#fVi>44pTv^M7MUn)^S-DqpQIY{102bP9XCGl$_9dNM_E0>4y$rD-!?41rIpAZlHI!gWV8AoqWg?|70!zR=vmcdAz(00&x~ z0Rn$CShJa0Dpmyxg!Ft0W<8ET?;75kTwHlT77KSC0E|^h%nUyExXJf?`WVj@6`5nR zEq53^rTlcmg(d}_+oYE?7&NAlHhE0Hmi9^zxY4?||5aN=ug}yM2zMq_A!lwJO1$HM zss-iox_hs3B5nsk(|WEs5i6*Bp3oHNU!Sxu*g;6j9N;3tWkN|Yp521{_nfq4EMr%CK*?^Ul@8W$nVbYL4IAa{!S&8jR7a#5` z&i-l{b6*Q&uycIJTqe%`b%^<-1T|lxDrFa}LSmskw*2)q!Oca<#ePRZpbpLtP%mrw zW1ztVx+Vn@g81db{Rt12-x6t6xrF|FU}*dr@=&?R@{ZkY0fz{kr!EL01TEyC4P!1+>20 z$!(9x?<>w_{A%_daY^trMQ4ld;~a-<3Em0M(WA^wZ|$_feZ1ziAXkV5=i}$T!?;S& zb)1_snG+Bs6zKJPjt(bULg^j^{z+NJbWihQzx+=Q z?wfJ-fvgr`UL8pv50qoYh3NDPQKC0WJf-0(=9>7T>U5|6H(H%6sDce%Oto8OeLLM( z-beC+Rm#DNC;L1(i0bbiIaDA9y_J2cv?lcpo|q7Z({EoYDOiD`txa26?W&b}2bo`W z8ofWQv~zfa*smN3Yr^-?u&OAw!ixGySRAxt{OThLTy5HCnXk%3Umo+J^|dd#VDV!TP>~fM#5|ug9pDKol_H1L z)8%CAzTQjwryRd7(H!^w3CS<)ynOq#){_1_LUkL#~@wl7!+r z)H>mVxz9V1@f{_5am9vqH-;}Fo9ogxe1ZRTyd`zCaMC~FbeV{kxFe|tT=d6Woqh8^ z)?{OF#JH0>z1^LsWeiGLkkTkYDQs{?^YdGsvN$v!EiRd%!YHWc`rSF(?$l*3X<@=XO%%r0qU9i8^@B8 zG1YkLRt~)VuMmZ!2*D@-4koTI1cwsp(+0UAZnJZDwD~>YDm5U&T~3&=4@nZ3q>BUKqQ(N@(ED_S+)q@m->@cow8^p&5}tzSN|5yZodO7( z$f^c0VO8R@zYWdJr#NXnfDQG>tmq9H+bLttZoI%5`!m^Glcik8XPT2lQLuD6CbDB zecg-g=E)EI7^tarUYkahijKPG#+p7~5b3~-{)RmmhzNQ@a(G-A}x zHm5n?X2I-4&5W|))&dZd4)D*tHL7}V#9(U4eG4zVVY;$%t1%7xjLJhbUTJAKr+@*? z)M*UwaGOC*_xiQ-okAg1eOx{%$M-AQ*EGQ6%&hWV(fsA}1KR*?AQb0vFgrglk+lhHkf!i+>$RrC9UpJ-kSsGvxX#ZE#{?GBqYU7KG(!uqkPETKyU?MWd_pj88Q*gdxFViozh!lCykWs`7&)iE~wUgs=7Dx zvVO6gO>8}SHL5#x^9^3Qy~7fR#HW=*)&lK;pDZFUrFn`F3gGiGW~FH8>8X#1?3QqI zc!rA8xEqFaWPrcs_O#hS3v=w9=LQLpy*!j)cjxmb)^=QxP(qdq*j$`ro$c923obED;DyBrW z*wDnl#8}mtq8B!iEZwi1nD#MLuF=K)Y7o#f8ua4N%wd4EySrV*C|^Ni5-eb$fO|=+ z@im1PWj`wOlAh>&Z|hZ#bi4PB<81E;gCX?ARr>F5HlYeQCDqu~_NL_Z*8yU$$o#Vo z2J8HFQkH)7$N&A*!iepj9mJGU#OaR?3)88y27YT8^Y8a|gLs#%=KI#jM~u^`b!#l~ z>60+CFn9|C2g5c@acxC1)4&@%KREms9O(#R^eor5v$@8{1;BUy(3S}TRGbGbEz_w3 zn{VZoSH!aFj(kYibM&z{vBF2~2S9Y!Ge;@yUk1=Vis~k<`kba;a@zV@{3hzWH=jY2 z32=UIcmHk)>?Syos9Nq>f98midyDDezr`1&WP+}(4B)ohi@`f>@IVj-D%`Gc0X2B3 zDsrZpc6&AF6`?o$krgiy7mFeJ??i`35FRSg24=`8GpCS!pXY1#$7Y*v^z~9J;rWXe zU{vm-YYLE^&csT4392diIR3i7s9!Zf5VTWA+)*lbUZbW|NxSFA9NZwS==Sy96#;y(rq5cLCx3g zg6Jyh3)`s$menj@)qJlEO^rP#{20kQ&t~SYJ7LfiTgl(~)Kl*RT zaFY~#l;u_@!MoJ~LEe~VQ-sP@b%Maqr4@QU^Pfa78>fsuur<{talR}#kgxeqJW@#|#>hnto!WAmW9(R?(TA7vH9fFRS4yZ7PJGLrj%Oat9%fG`bJ8jrx^F1{Gvil;72ms1HEj3T_^zp@tr)`~ERK_w zeN&H(lt+n8M+WNB*tu^ERTt;sxRfd*o#+>0R0%o*5}KhbZS`Pp1^ z)?Qv8^3gfvw$sQK^gZ6s%v(4ead4T4a1Lvibu8UCAR4Sl%i4@z)hk%qwg^=_mN6@l zI>ljX0})0+1JpdpMTI0SECs-|CSfO;7gn?B<=EJ|7hlpDGc`iDdK5>b2lxXUF>K zs=(tMgK`EXMJ==A9fo z5Kl-IuVCizm~OHd1#kZB_5?XUt1hh5>PPM`T-x+&&0Zq6(c>WIUX`5x_M}M!uww^v zO+H2Do%p%;qYAX=>#J!;N(MF!bk7u*^=7_A#HHYtS%meYTdd zFGA(uU#V)x(NLd&f-DYbv~8V3>;G$%c)tx>+eWvXG4k~`nKujsc0nzUXWx=zfsaLWx!6xa@l7D$1N zP_8)Ng~9aup;N~<`%4<9Nzm2x56rJwW3xTkLgs@d&wmS(M9}eN30Ah>q+rV>I2%Gf z3)I_yD;@1Y6o*oHa3HN+X3A$aZ|@o-`Q5*G_q|+yt(kJlIn<*%ndXkksU0lIT}j+u z02U#bgbIjxfA{Hhi}C3ACg#Eb+B##BK3#IXHRGjyx&ZPq4^OI3;XjF8Vq&W<7a^<+ z+pW$|Q6%b!y#5Koz-WiDVsCebCca%2{f|mLV#k5^2lRb;_1NGC04`2MeOsaJvB$jx zz2?>sEzXyxIB8fmOsRG2>hyL@{HPdMV`HvRbG#ksUrcEbF9-b}NsBHuIaOWBYii=p zbLHzftOG#GI}d1~=123)F;a`>B+{`$8#Y$Li+h;{3oR5sEROon#Dly-_nk<*k|)nM zv#Cx>O6uRV0H%9nsD0{u%y}Mhz~ctMpz_?yQL2%MG#Mzv%Zfw8*nD@Ou6JJ~BsnHA zt&%B*G5xPnNAH+*=>@i=VG{0oyrhPA{^^HB!hb>JK7N79$G%f&yL>!4Nqb%TP==%y zVzCKfn_eJM{Ro)WCv(<(wtAzsp&^4;Q=`?H%QDBp*9E*SGw|wGb_oCNX6Ty$QDk{< zNHs^>tYby4j&Wjp$SHtT+_cgbg#+&lfdQjCU(9`JZ)mG+oieW@0;(9w3V3i5M47oaV_|Zly&%lW<4(E< zfa3$e+P?Ee(;0hHCs(P7Wc6`DvQ1i2e&P!}H~`sEfWwlg+JZWQttbSx%n04uZgbNq zbVW7Zb)Vxb(N;bHzU4JA#lY5{*mp90Tihqz7q#BA6wRllq{at&^@&~khd`QyLmegS zwbS3nqoNRnzhW!G4)GtL`TXy z$sDpv6+@c{6-If7+q26wQW8P+OyjJuI{v>DAqj6MWQ38D8-sBh#yDil&?S2R9~_Dn z*=olhkOI9wC+Ob?>qhr@c>W;#hK7e4z-6Vwm9dmNooQ5NMqyQfP3q7HEc^9NrX_^ z>o27=;Uu(+J@z*_o1_`9UKOY5#1-8Nx0M0daMElrw*k((t|mEfaBwaSqByIZjV{1t zq$Fi!GwtoDmEIbrH|?tWBhx(QE85!?;}XFAxDPyVGgJ}b--xE+V@+G*{M%$gQ(}yi zSht)nL}kHKx+sMu+f<}E4{@|oIxQ1Y0k4zkS12$}slYq=Uw~qwtRZ|>X&#a(dlV!9%2MmuWR6vddKBRoXnW7CQK8B zEpL02BZ!Ik7;(UA3)4hSAm#2dNn*bIt0<1ZYHegpJxH;+@U|QWspW;n_Oc7r6~pK50w34k}u+WCvGX zNk;ir`3scq$pnF3GUhYq#o2u;HOINk2$Rwc<|nAfl`tTYvvlB>zIfO`@7XNL$^y54 z{l%qdvu7owZQo%hP_lPwZNF|wsaPS&4Utw^JQzzpA*z0n8+w|pIR!d*O zUs`c(7@Qc2@INvsqLOy5{v|)}EKrg~wjdH%h6lYrk?!HM31BLXar}bjWMXWy*ietm zVigF+-`mDd?i2Ho%+^l|stdJI8FD&eO$lpV8~%hlj$gmS63alI8{YLyM${)}LnK|e z6tQ(t@y4)FUPV=6FXkJdbXy9bTzdD^#z$e};wp@fy?*+XcFn zh<=K)fT_MCn9J&I{eXV|f=8v~gW-=C?q`%kTT7W6L7YB2{khV!LcHo)i0x84ixQ&| zp*X5kx8L6pim{uueklyvCxihGv%H6!=#j~imUy*F_V8)ZzgT98@iOZS05Rz^{Z0p? ze`0683|Rp{#37L8!cl71z^;}Qn%XGxS3@sj=-M^pALt}OQn!%5j~^cx%+Z|Qn<=Eb z-QNN_Tu7W94ajT7&%VdKtmdDQQYyET5t)_JF0+NkwHiTe6WaEsaaYaGwg7{Q{ZYZb zz)CL?Bx`?b1X#L|i76vLjg=&`(OuHQX*z;8f^|*mX6mX!%RqG*X-eSpUa8G+##m-l zNK^2`sUcgaz;+jndF-=hv`Iq=(hzo;QS9?Zt=WN5xG?!sgSrT`SIiQxjkxglCi8m; zW~KWT`2pS28`~=;nzmb~!l@PZ@N@d6!8$T}j6VX+o>Dqp-y4|eQG>(7y&$57`qwK8 zBBq#H5UH7(KFN7g`pNqheUL#VjYc!mviOW2aTu#}W>xt9Sa$b}93jrp2m^LzW z{1c|A>qlBkVp!Mp>lByC0Eog?!l@MbWM*YyY5A{NxXReGFA6_UIINB8+YWVzoxT&| z{UExzFU@t+Hs&QO5=xgo-LF{P0B~9cj5V;q*#!MTYj}Emub%ByW?Xk&sNyR7dm0WU zA91TqM;x$*USnotbbxgJXrl>cvUne89;$$EX`56#3PiLnBhuKPIB<@0C`A5mHLZw5j6LJrJL?>8iEH(G8b zaN_8oy9xBPnA|1%1yh}Y2+=4hIh*yzq|ZQ+kJIr6$>FW^k!bQ(8#mXxmQ=+}EBCO8 zkLSC0rbzM)N=W2+xwJ)}uInD}?*Xoeh4)}di~OWj^G%!p%-FL%-7$7x`?ut{@tD3F znKVA3;4{PSsijea(R}b5vIjr~W;KT510aNM6a7NZHjSCKD6Q`>ViiQJue$R=t0I1S znYbVprVUyb8X@u?m=aiXV4k2&?fb*ORSe4eX^N*@BV?`+W64pDn4KI6u#Vyra9#?g*^eIbf5y5%&pRA zgK#y(WSXUAss(>b<2TOKiIMCph=F>T9+2Q1AkHMa>3tn%b?IaZRiF-pC0F0QM|~r+ zs?WrG70{ANnGo);u(2x7%!( zKJ)S4NRJth`I7!;nK!ZdOxvr91w+=_vq$`^=R^tRI}$3Ne7JcB;(QzWj)6d(CpjLM zLo>Ie!)sX3P9~G-D}%~+3fE~y{%^b* z0si^Eu4PnqZWI=vW442X2f$o43qm1I%CZxCQs~y0m#BUmiJF(W=N&VwYry<<&67;tL5GLlzv}|^Alho;_d{Q{6P#^hE zY0!V7AH<9Vg74_p!|X&7;{->C-tcE&{)j|koJB}Wkgi2fHY3*J?m$1;ClQ;|g_T$} zExD^Kq#U{|ao0Nz7!Xq@d#lzUs}DDD9R%-jYL(Qsiuxhf(I*3FZ$;c!N?nG)DFWIk z7Ge=%7uW4vrfK+Wmn|4ie}pCtSa+b0gB4JWJx)@*yaTQCT#ExeyV{#;tqfmIURG{& z5euDZYaBGg)t4siVy?7+0OMJa*FIMoVO_f6sG=DDinqbxH&l-LwK7gRnQSD@*Vo+l5>Bj*%HFz;*x>iG z0s4hi>E_l<>LRjIc5H2L&t8L*T&L%sRH4UjXlFVpeN?of_w{%;YEq$487gZp43(QB z4G2m%9_n*D$izQw)zVzwFk1E*_#zOOwna%}My(z0w5cd!HZ}Fdb_i6EI)7_?Y^DOfCQy>KC_LeJtawXW-FF zF9=Vc;!^~|C<B zbkiCi{b9`ZUK5W?MLFwBUBaJMN>PFS~lv+3_$HAlmwXORb;?zD$@!=*)_w;a{49alw zf`zysB@-_4Q4T;&s!z`sJ%J&jA+dFf)ppiCnq>G~RZ-)P-=A}g6Ez1B_<$*?5QvOF z0#vUz;ZDm*U1Hbs-7Js4D?59q=C?=Q6QADOeqCrGb*qJOvm#^Kv8jl-Mxix(ti`sB z^Up*7&0bYr<&JZOe@v{l$7l+B>erj)3&RJAVfFor6RsxD*BLoTsBHaKb6mH7*mS&I zefxQVnhcpFVMz$j#*BAy$eEJTfag)lRqpNRF4>hNH9c|I!xswDaw8A^mY1eYL%Sm^ z@(XdbLDIKIXk-fcz2}PM%kEv*oS{O?{;J@q#FKT;qwG)V-1Gq}B$}vy1+s-G=DxJa z(o?gJ5NcQUPOSjTQ+2iCKXI)0NzUC8XIB9*dkSGf;vji^ne+*VdTz1T^Quv}xe@itFUL zk;#xs)4H@#qy4Lz={voU$1I<%I+6VTTUG4!GYGZ@n$oq9=SAYAm+-bhV;tN+Y9e}b z?)h#QkPv4G?VRNp{`lnmcZX1<7p)(f(XU=Oz;<2>8Bq4 z_0Y6C^FA%hLC{dHc=@+dej>g(Ltf{bVA&fIdt?`*o!?vuJWW+pv*Az3IZF1-F;jt% zExYEav1@`ZSVP}o{e;qZH`%BsTS(oGybPy3>=VKK=$>2+qhVU=#1x zd_x|J``L1A?L=)&&N13SEpo_oX4Xbt&k32HEmV3MRcWmxENR8vI8GbnxJa9DrJ?IE zGaDLoQ2Q9~y&D`~Q=2itW4ayj2Z_9d%4^w0^(-w(svns6Bhv;Mb>YUFYL65C;v(58 z?$2&c0NKfr z=>YjFaIxVs!H>!mNvIgNX-{%LUZTNC>)=$d=FGphtXnOt(FbUkp7a9I}SZ*e9d{_qB2WB5R36bl(ZG57&6>3%csj|e9O5__cB*jSN0ft1QPZ09Tg zTefRr|21N;2;FBU3wkcJ_Qp`=$G^k`ZS?pi>9MHmu8Uu^s_Y{*2=a=qDMaSKi2Dhs z0$@%TxyndSd5WW7`V8Mp>o-q1I{vD&ldF~dyVWWl zsWrk;b!0x9k1;2IH8SIZqCEi% zqr|u3JcCF;{E!<$J)oP5AaE}>@@9T)m3jI?TJ$lC3-`&q93O>7CDHqPTWT-wV#wIX z4dj1aH*-O~8?i-yAz6X0c>sXK z-2Ak6>@xv!8!=-x%1G|r2Y^$3{M7!c%F`C5C)7|kJ&P!sFD>EsS;7&qT*!+djc%-x@C&>YwYA3qm|JTxXq?%0@_gGmV6=6ozNc2yhsI(2WQvx}^&Z{YrsHnyaYxt&d+LLW(?tLPu-cd!LQDAxJNM@ z**_`dy-cdq+dFYfY0YMk@ZY_zy47lP z!bHf%Z4t?D)_pGQ4Ah? z!C3Qoe_$k#;8SX&bQkP0)y{t%Ok$r{pv2pe5NE7D@)tAjvy2(uCXS0h^Uhf3^ECyM zeqMTyEG>JT+o(ekrM#(@^ZUGuaC{(4u#3ea!~vJ)#<7(7(tl=4?>(yNlPf_6Io0I- zQANvbXY8XG|Ho|fO1#$Q9AvTv<@roGQ9WN(3{Z?@Vse*b~2+)8)tTyYNvJZ)VbxHy=9 zMX9!%zli~%cLDO%`|EWqNVx5SwUB91#VG#n>Ag&=dOxo`GUw2z7O_hFKa@9Ki@Gnfic#r((|b21sUBpxN9Nm4ckmw~7iu7I=o0^%KDi87_$(#HHYadtH#Er?%Fw$RQ1JH4n?zt8et zf1)#6p@0yG!&fRlb*EG+x6ltK*po-4nn*8U@ zpauzwrnAu?m^h{K{M2n|fJ|cnVeC81biPD|PVKhxBBCx?Tw6-}-PLy@q?8(mY4M5U^assus?in8fYdcc3r%P^V#kt<08C=I( zCow`(NYr@EP>PrDYBl|+?)%n9_B2=wlCM)8DV&3?qqH^q6_)zeoT16SAl&I^w#~N8 z10Yo)Kj0~1{1+@vM4@diMa7O*fTLWZWHdPYrJ2AOH+n1xOT~`m_UUv%vzK*eN~1!7 z)89KH?_0&a((zw>gS=atpM4|^GPyq6{#cXv8<%QknXpOP!!XYZgFI$hN!nRmc~_UL zs9^bK0!##HUoSSF0oR516fXS{madh}k(#%!pMC^Fn8fCL3CrF& zmV61@+RoOsnVM)#9Rq1N6@NOqNC86!iqW&!D=lK+}5%yshx)- zpiaGO7^S01wMY9Xe=k94r{3qaSEpTkV-Ge;G7flg=2HSf{{gyNoef3ixUE3kk&O7rrm zm3tQU4zh;XxL7VPhy%>XkLLcMpZgf9&3C>~=iOJ~Sm9VO=VOayUNiEV~By?N8xcD_7^n=T-$-*5r5&hMp8h01Z{r7v@TDwcN+Ofpu zm$8W<(>%E)l(PZqs6<$$d!K=EYHlgf?D~x3iUn92lOa1X{!yoQMo|3?N|gmeojk93 zb}jg}Qz>UrOX_!Qd$z@neK&F^Scrg;SaQK*Gv4<2=vvpwox5~G3ZZJ7pFNGWnLnXh zi$v#G*_eNA9jMGsh$4e=%74MLu`+u*D9bb7cp_^AjB7V_+#rb>VNX5R{b{F@mbCny z^aGz0AN>~5EYS+QB(;{Rs5uHb;y>`Da1XMXQf6(sMm98~C1Zb7&qRsux-ZL-qO$(xDw z2nq;8b~BGw!Ecs@;{?ZMaEzjDX+1RgRtvaM$P^k<4s4#;vxr6mnj}x zSb_ixHdbt)oHyM>=$-Ti(IQ_d9LwHBn}PJ09LKwGehnH?BIP<_=eI_I8Qt zJ8jIX$U8J8JL~uR;$tdiT$HuaYgW@|(7J5Pa6CSTDRMY-2>hT*cD_{%of=i45A}(j zF|gM`ni^uSzR1DkJG1~AkzdcTpsdz66z)FX$U^SLOHf+l-1$l!p}YfiT`_Re5Mtnl zFUBSAqc^fDS3x#)N2}kdeSvqSKB`B_O?h-s12TYR(_Jt>A3TYJmq7`S)j0k0d7OP<9C;a2 z{N3{S-riTBT_MrOFd8@E3CdJn_Q?FPxQ1NgP#4r)ZF|cU`2Zj|fIWs`*F>C*?NK09 zW-7>*Br-b4(UcVmHATN@hsiLbl=MXJUfgh*Pv*$H0^fO6JQ733n|927neP=h>m>F1 zm89L2Oj=3~3znrT+L+=wM{;BU&@g&Rasz)vN@}7LfC-al zMRRqqB)H-I`TiJx1ep0Cw+D#uHlvA!9QY33c_Es+~yuwx=qss)ojdl|_lci&!SKtAuBNadCY z>I^@pGE|gUOpMKDc`l0mvFzi!Tk-=S(xwOu?OR`PPFHSo5_``U*BUz#_U%Guc0%~4_$Bxg;>d>$%vvy z!^GnypYE$<=&0Cvoy@RYZ`<=`%ehUVw=gI+=8^bb9xn)0HjJM5!}zLFUiyV8;-{g( z^S=$j%(f7emj7cHbc8PJ4j&Vn4G)0etW;5(-Ka+bPL~Twewl-CjtQVGx1-|NIZAh> z$rt2)ij`X!!FgU4mEQ9@tHjW!v6eq{X>MWAGZ7$jxPN?mhq)09oUzSvo6aOdzE5*NFfX3`8xa=$2) z%)yHNy?D3JnW69AR$b{{tE}!wTS%RWmhXAHt&`B-&*F|pg&E$j z>d3lS*ce_*-9)cTy@v}sptftKg|oU5LTo+ef`XQt&-4W{FVoXmuV=`bh4X(WHN-A^ zwrsu*P-$-cXE{}ZnEwt8eD!hOn~KjXJk@gZg?sP18S&~xBK*kD*z}!>BqO~+PFz19 zRkeNECyZVDidxL22SBy@5})PKpBCds58&}AAKbqT9l-f^u@|1f zt{AHKAy4EG_}5Lk?BtFk^SA@flVfn(Yml14Q!-#hSJWmc!sgAEgmcyEKVL2MbB3Q~ zhvL4YQTFdm-FV?#)p9^5;~afF;>80%w5qQAwR(w<{IF#IEpLzDU&NayL#^^=csR+S zJn{;h^U>9;uJO6Ev1P^vgV7}ZxgXaWIKr99_R|0Qlce9!C6PeEaslB}Cp8DBpg0O$ zs8k7Y+x^byy<1759muYOzWP%8%%YhKEzBJ>eZwt!7sj9Bi6%kjNB^@#Ie6Ya0M^ML z#q07ZYxRv;HWZ)L3r+Hs1;0^I? zN7#ISwSI!+h0^sF0B40y>eYVt_M6jm=Z$VOO-eR#l^KZV@_%Y5r1E?+l2?C!`~iJ- zt((xUe`_5YIT1gxH9gMQQHZ%e_usLnukB@|WPikmQ{-p>) z2zctNu*pAbjV3S&&^1BEf8~$=0354YU+qC>tj#P|o*mR(<6ZB$po-y)-E|?Qf=|75@N)ds06`4rg z{r>>)33-KO*kgXy_9NzB4(b?OXC^M6_wt_KwWX@CAMlRfVD$N-?brTVQAJF$Tr7M2 zWB@a@+4&JHAx&>!znMQ8nw zh32)N-de}j<-UXi_OwR?uZQjj85wl{0OF~`_N$SjEHoK0j`Aqu^P-CBhDn2KRQ~d1 zkF2{8kJ_r`(TaFyjX_ikaltNLtDL_s99e@+u-Sqze$100{)!MKdzu_IW1GaAuKlu)dD@Bsv+xTDJ%6RJi z{{R7p_Nvx+CqT7OeJ;uW0NE-ze`;-XbkMDF{{UY{{{V=hil6L!8v8$sE9 z&G;f1KWR@DU9&3KSd3%%kEkEksL%UI__d_kmil~SByx;#`u!-Ph~-!}_CFW?WBT2D zd|#19U)ndts6te(&=i)~kOp zNc?^AjGyxHWT*bPH~#h6nJ(qKYckUxfbvpJ>hEtFN}mn lPw=X8d`aR$&VA+3S>TDyDLySgy*zvbmIXJ*#4_7-F2<>TfP{e3}6)wEt;<|FfZ?KiP7b|I0hpv%WY2k}vB@>eab7?u_`(u@;Ihb6by8~nJ7wj! za1Y1Br=q5zrF;2`?KL}xfS{1Dh^UzCJ2`m;MI~h|Z5>@b{f`EgR@OGQcJ>Y)o?hNQ zzJC4@pCY58V?M_wC8wl*OZ%Rl@iV`mu&B7C^w;0&n%cVhhQ_9@?w;O0SpUG_#N^cU z%Jv zz{3B3A^X38{olA20E8H5PtL<21%Ls_?U#e$XrdAUlirOYV=QcvwQM7itPHk4O3@jt z0_WDeE3JJ*K5DqH$9G>*Hm)6!wkT9^#n0$d@e7>4?w1nLIBJYBg)LO2$7v)jd9h8R zx0bC@M@;|TXlaW3>`J__{fax?xlf{2RH6);8J4xt07-rLDqdVV8(r{A-59EJs`j}E z2|k@HZ2b|nVajLqMIvblo)cikkb@OCzp?Cn(bM#>e6(xrKKzrt;zILs))+2-uTu1#I#_$3l32zLC|xw<2dikk@4Bx_%q_tw zR3iOot$M2s%VX7+)V;Leul4vk&5Dyi3yD{CzTlRB z=$rTbQoM+>HmlS^bl@fAB=%xjkC)R~g5iPlpM|EdN z+uu|Z72L4{qdA}B<{L3i`HAr`X?*#moak4nG3V}$qAq;?#23h4O zKg{DHO99h3t6N1%rkVA@NIji@BLOZZAK!;kVdSVj{~Fh*NdR0&?(?V0C=G!0uXiTC zzfYoMi&(^9m|m5lwwHq>&{HU}D4;#RNMj{-;Z%@4eOPIBOIYmXbOGFk;b9aToRkOS zE=f4e(j~p}qqk&*&QyEEnYIj8CyieiKhIiLKuYnP#22Hta`*19&Nn3sWI1UxoCcr5 z_Xd!^`qEFe4sS?srhTGB9|0QUPz0ra}i4)0M8ctbZ`@!GGE=w8+${1l!PV6f#lt1uGWIatRVgcMXk3J^R<2 z<+Js(*`ECSF}hH+K|JlK{|QV;8qV`hMO`B;YTz!Y$qm-RH@ z5s;-N#k%}Ghxb@)!JZLAJO&JU`q2|%lSfJc5?vrx4wzGqJRBqmWo`K z=GI3s(vPuS`R)x;=CnN7$ypjll=TPbo=}eyZpwgA=*e)azkmPv1vJe{bO2U*gYsI& z|Lbf*xRdhYTiltxkF=Y-o4m&u#hE~o2!5U!!~NC1!5Hobel z2Q;lxvUYwrscOj8f6F(+=KU+hgE(98j^Gr+W4*3=19w3&(M*m8-KpZFm@?AQ*O^uy zi;N~)Z4xs=;$AjZ>RHGW#74H z%x+U$Oz3Hb><8Blu<8Hf@Bw}42|+Wy%uIe;89Cp_g*stA8&eabyO>7MTE$CG+pu6T z=TS}^gfP}RmJ>m?4CUA(<0t8v<_|K?EzhERv{+KVyLmxsem7d5X_)j&fYFq@lh=vCx7}>CPV&@FZ&UyyIgqj2QTD_wG+OZ{GI_;f z7=IJ*YCT8^xsR1_?A}6dY?x2)Sh^Z0Iqqq!sX2SGeJ(_lD2k@9ErpOEihk{THG$oTLvKQ65k=fpPGf4fv^S=RTJuR^1$AHLA& zus+MuEL5y>QBGWpdX7{%UH-LrG&K&)jFbrim5o)jaryeO&Al~|B65Ghws<%D&G-Bz zHwjr5Q#Ahxu>P%7*CQPm$&{dnh@- zHxpfxqA|ysY7_GOBYNqU3yN&^mf`9%NqoN`%_4BYRoq|xEb&_IK2~KlQ9~Ya6C95qU%<0h#$iZ%q6s3NsTRD&-%nCpvyOKw zE`od{SN*K-yp*3j=6ZqLhtm}NwiZplRi(19xIi4pDqd(oC#>zJ8`zqGv$q>?E1D zbYY8MeE1yNaqA5)Ik+mZ2hqUUsDJD|JBziw&FGVeNKnaP?}ooz%F+5NMnc(iEOB9C zfBlJIaHm!2S-(b7i>3xt^WpbV-C9Rnf;4eU_Cq z<)M~r$6YII!`uPY68>)5^2LE_w8Vy-M1;|9 z67&5xP&!Hna}rBUZyO_tL%^Erf*clNaHzbiQ{MwqC25Mf6}rhI6QOVo{NpYG=WpWQk?pS~;^KR}Dl>+Ed1!AL6C2_%83Znm z5h1pIt8n$@nlT)qRWRx&C%OMp^M`NKGSzOC7;zGN^zo^BJp!n$_z>r}AES?{1avO3 zWc_nCXSk!T3{|-`Ke}iu(d86+#9s68ZvG%2seJ4I+qykcu&jd#B;+2)pB*X9)H3r4 zOdKf9FJEdoDBkLX$DwMc$KLjw zPa4!2pW<}olBzof$0oc;1`baU%a4MU%Qtevo0=Trs!bL!s?=94BcR2%Bi_O2h#^U4{}2KEPC=o3)YJ3?;Vfnk0(d_tGAB8AZ9YUSO^%14D+a1Ru!VjLvHB zGnZ=%rEtNHTTLFw?QCAE;r^)JfMr(mq-x5ATtk&^pFx=f4Iud@T6&_~#F5%RZup{~ zRkY6y=bVyocyv|B%?}>CH~Hf`9Pe#<-z2oFm1X_plfZo`Yjg9w+b2qre(cG_xZIhR z38^{VU3nbfXyM0Apz!xirhGPFD*LPHWXuWM@o_sk#)d@AZZ&y8)~!<5ZES0y$u5b5 z?xM>Z7AA+c+Ia)47H!T^dhyhNR4hM+yNrM1TLk6y9e}*y2$0B<*sMg!?qXt%gF}sE z>skGmKvDa=;i9{-@Za7dFhUUMUhmrw97?<(6LBy9JPOEH#@h#qE`*o}&IO7K=<8vB z=!svtq}&cj-_T(Jmb;tVy;Ue}dy%jCj|pBHsC;^yZ|y~}T$4CND?=s3mV;cgU1`bG zYnrrzT!RipZVNsTtA!X0$l+rjeF>iO?7~l+wv9P~5O3@i_Rga2Wsv>J;+qSE&VU zrz}!uFg~M4;zCa19Vd}`XHY{^eB<};@cRKnufTDHmJ+k0cb30}zwI#GMnI)AF30GW zYFEMnBh?278#xrjVSoqD2ud{~xAB7??63QGj)S=n$sZzpjOE=F=`A$sp^&Rz^`@kO z@6N3pG|3aZf4$yBn}qsr6`0p-Fk>Hwa6bZc45qAO7Ab4U0?#VPIKrYkmgBs~l#j06 zjETHAFP-X35XA=579`6KK72iHLi`E5vxQpK-ybH1JF>`#LJUSHXZC3{jC+#aN_!wS zD(ugfq7@Uvv(~U#Xa#>8D1Fo)*}q}*dd?SG;wwsNVx7nnd_klD`ZaYn!m`!KykiDu znVR;C@cROI9m*$ zn(5Wt^nl+ui!!UYyk4NmmgqkMz7z%Mrfxj~7P-oMAb*?C^>=<8^lH?ZRVa$GWreNo z>9We3X4-5>8==8Oe=3O+SdI(&6{31GSm@t4(~Jf?1?D~k&SrA;YYzPZUaJf4i?wVY zD4usY4`%;riNhK|Iu0-J*;tg0$pqlTyX`i;bX8;oT3$%pN)ftCm7u1!q!g#Du3)lC zEN?q-oGz|PG-V=KbBN>}>mEjRo2bq=So+zDAV-gY{gQmm&?rdM$-e#bWcLO@RyhBj zTD;&KA1+(!tEfo>LaASI9h+xy5#v+VA|LeOMWA1%T#9eph=>41-xX45zD7%6Ulum> zNzi|6Gl!}hOrHkTa97B@w5*DVi!V45d64>j0}Tulrh?~iJOZMAC|+ekI4Nb+#{;HR z1Ij6hKhv*>R)2kC&hdkh!IrJ0bI-`XOGutrQ{1~^wr`^M<=>y{F?~Uf$xvc?j2hrD zwA?xx@eK0JBQ-FuWa-ic-u?)vNRQOP5pl{w0XHXeB+&WeNN@rtLp8=kF^*^DnrR3V z(U0K~dn51SyyN+bTRlnb?fyw^DSh2|meU=d`q`~b-#NdSMv$x2NlVp1zUS}Jnw1x- z=7-SV>=vMwOdFUGI#GB55bap*CDnar*Pl(GxD?7+ewx(F^(87$B=JuH;$<==@k-?4AQK=(6o zkt}bD@zpW$ixz#*-FtXxK?(v3N?$BQDL5k0l;b~5$Zv{ZxZrKlr2u+De=nW-Z)eiH zGn4Uwf%e}L$a_(x;d^?2zO^Kl%;tsd8GXkX@#q}e$rz8;;C(LTo!brOix$8kYbL7E1zV z4C%eAVAg?;0FJvO2~Ov+<4`1r_307@vwXvy-jKvf{X3}2zCcr5;Mr;PI6l{KI@_3E&JZ- zSWkRMUB+6x*v_lA2~%Pj-#L+DD3OeR9=wiIE@SqbdTI~IwrfIpMwR9?^bmKrRUh~l z3nR9?6e%)$MPK?>E)yMgEJ}-f1mNFY1&Wh^-E8YAnNKe*5!gX;GQ$V#9`+szQAO~f zal`~TQj%rJrk^3F`PVQIKTwf2tXewvx=C*i-u;hw%_OMw5pW9aQ4@-ty*DJ?RG%u% zhx?*P5z!b_za*mtMG(>(I0tl_Uj3C-(a~`DCheWptkjpH)rsOK@!HuXaOuR#>gTgn zBzw8P^kAgMWPHe&`e*@kt*@_?B0zySep@V7Hbu3Ny(O1er z(DxMi_i(Q(#Km z3vC>+Wf*Ot{CRZFzW#&F8~QbEO{hkro)4%0c}(AvM+gk?phEn|ddLUI!^HL7`^xoL ze}p%GT;(=Ldo2V!f*}1La}_$cjQ_kJ$`OG%BuWDI9|0HhG?qUM?n!)uC3b9?YX9>A zkQ=BBuC03N^ZY?G`JN3XdmTKT32fJ9cJtoO3b75+xeh4=C}>re2gS89ePMX1*an2s z%#Rgv9~mhxgoFd9*{>zV>mG8w>}>V!-`P516I4HWI?>pq^0ZrT`lu+fPM#HDhA!1P zRxEfqetPHf2+);mD25WV-Czf&W>vp=x8R<$qFA#2gJQxkm$CBjpyV&ly_BxRCbwGd zx-NJ#E@YJV43O$Z-C>G=0ChSQlc!PCllXH=bO&;9s$tt22p@Q0(Nj)>NW1^?z0(f^=>S@A7ePvJwa z$-kBR6jM1bPr&_!kwtY1u>5P+MuHlXth<=1_~6=qhDgTN_~jQD5r8kW&fi&yO$Xb4 znm%J^koUMOcm#a%BuYf3k_|)1bv=-=@l2#Xiio3j8~YoNk_H+E+-OG8;(>d?K|ktG zkT~3fLt=zNC-BMf%JQdc3{DU1En_4%-`mR7pXST*A>&oN@y4}0YluhOO)2bfnR(#e z5M4=>J>%}s*OTbI8S#5f;4?VtV@^&gctHfZV|iB#-jbA4pRbDeCj2hJBbkvCHTvqK zaBVjcf?)Q*)EGzVAC4 zo`RE!z@ZLzwMa4gpO#GF$tcoo89b=Z`iRUhFM)kkiv-h|q$;>Nd`B`M)VGga@7npZ z9=1JyuK(TGJtpP$n*dTpPZEVC9MGBSwn+5#+zegrdHxpbL-vc$5q|N8MQ(O!*Itnu zio;2P>7BGY;IBcto(yQ;PbE{Lr7_93;HRZ`sOJxLK;2?w$*pv|EiN(rresz|8j5y< z2}Ar3215iwZ))cq!`JUcby2urHp!YtKn(;q3cE508H9eLzV@uw%H_1tXd@AV#T}w-I;_4ax z@b+ISEqZnCwR`PSh#&KqtE{QIRgxI1Z40>*(QM7&I80kf$ ze!Xl+{_ONlzCp#x;!I_eW-K0i&am?^h1rA3y6*j{_EaE$NVnMhG23t&Q%e4IKrOB% z@pDsyJMBF)Gbf6^i77Ini96KG|FP(+`O^cRL(&>tU7k#ymbsUqaWAG%3{PhHQCXO& zLc7Z$JgFnkt8y?0-7&v%Fdc+uw6A9!$}8Hdc#ir%G0WQHsIj^P(y9U&Bq#OKesWf# z!k%7Db}`n}xW_B=9(KrH`4^h?3V~&JE?#A!ZshX_06DbeR&RY%f9u!ZUs+)I{(V-g z>$Q_v&_9LQDteDUcdf#e9Fnd;fU{PAP%Rq1-gEa?IW@>Hc1}um9Q7X}%Zo zLee{VO)%e6`TQN*{=8Gv`5GGcPDCwN(0GeWATfsdph;QeC^k8W}AW!XqBR1 zDz0R#@+^$y0tW4WNQ3%d&ECx1+kJ3XsYV&H7^f!c21Ki&Cazr)>OD{?YWjsY&iRi8 zX!D70)=J)(^6i|=vYatR)q=~WQ5yG(TrU1HB`}fVUl`+785bc4L*K=ERZPp$Twu{c zY8zMmAh-#!R-B-+XUMYuy#iXL`i;`j(4uu<)JCW^z5EF5ybU1<76 zH4;1zXMF^WndBA{5bNE_F3L9U;pf>D;DY=r1%Z^CPsF#hY40Q8ZmR6e#!Tc-+*2we z3)@pQe|plrZmki|N&5qV3BHiW>!hvZ2UER`N1u}c9Ha?coEaQ26TGfo-4+NksXYI( zD18MIc$d#$H8n)H1~D;xGR5Gca{f7TgafHJrHA=(ac465!S1fsbPHG)?J+F`;K33l zF@waOPa#T6uIuU~3!)wYbjc{Hw!(0%!V-~v*^sa5(`DYkx`=)MpM7A`l|ua}K0xJb zAf=Zs28jVX@R0WrFkgCbrln^V0{*-idlv45d(Hxj) zO1|E2hHM$YANs)ef)au1(;c)bGLR|xxktcwX^>{U*+t(fWlh9v97)L@R&OnBCH_0-Klx8zl=3RV{+D@DL)z*0x z8>FtRLNgt@P;jSxwxAG4gEHeB-k6q9>vIGMn-e!5;MDP|D7K3)c(;!;DvF!55#!!2ai7Z)JW(lIjEKt$ap7U~t%V{vf{XR~ zC95!g-&3e0kPvqjM0E)m5efysTRlG5nY_$}A{34MEhZ#G&KCZC>5^nk2o03!kH~sR zV#%FIo7(r0z3cI(cbhLxA#i#&6+capAe976G+gp5;gZ1Hz*CTXnFgw|CPg{wm80l< zBgZ6JQ@-Kk{*?h=8%P#wHL+W;%$5FqId+_~vyjk7f7}JQ)13;zt)0iW?eVyXm#YzZ z3KEBS@a{|bJ3}n_|MkAhaR6@UK+Q3I7sl$lySkSOfzR_kAS>s@v$hnCLR{krjE7JcpiQPJ{3{1CsBQ3j_0{)OsL43wrdeT zX`LiwN&5mRGQ%=NOk!d?E}sqNC=(9z(pMvD4|o-j(7vv|uXWrGJg2T#$rH-DUH%hr z${{My)p(2bA+s|h%WB8C-PKGxM0u>~bosPjY$bn8wo&0Se_uyD?`}ANp36czHvuy0 zKvicZ{TgsnVR4|;8fi#3azFw}fFn8iHdY>pk&%@|E22+@>T>mcLGd3!4s7gKhNpIwXf3{q&pQPj>(wFaSM}7}|IoSQ1ui3PN%Ak|X*J`5cm95(Q{adMH6tvHd zXMztMZ7B+})YQbejvTn*BiG3^n3DAfaSLkcR(aB%r~myDWc8;{5io&`1Kl%Ge<%xv zzq;EwO_`+EYK0*~o~C_u5+x9%TO%C-F+$i7RdY6dG3gVQe>U-9|07Q5H6#QZakMi&D!g#bhclHZkhkg^K!bd=t z!V8DpVvZeBDn>nlwxZPq>KSUwI(w=9CF~#$p_Hd&lPR8lM*LOtH@27Gc<8+qm&6_c z9rph|u8aYZ!7AH4yXu3)vx_s);b|Ad2Lx3Id?Lr)ljSnjG)FTn-u=d-&4tZ5f^SGD zMfV}eM>!n0a>G?8-;T`;kAK!XC5YW^}8n$ zDA?zwthwwG5xM(&B#!vQI&$$09GLLzU#8Z8>Ro=W-2Of3B7=+jf+T-AmYSj;SXW=O z97UU+RU~(3ysgSJ7$UGsSaJzkEbx3I(kC`+!`FPx^&$9X=t`mm#6}x@VNsF0b`T`q zb1l?VJ6M+~R`Z2N9P>L4zPfpKzT{Q$FJDq_)qKPGXUxtSDxbf(iY>hhW$gT`=H?%A zwXYD-Q%~31dSE{u87}mdD?2fNp_{PyRn2+`so@(pgFPxYeKh8zX(P%s-)=Icu@}X} z1`a7fHEF_HN|SmwR8d0NYeAq(Mos%GLm!?Y7mGHjIh~-6@Q6lcA_v7bnif41x#MC? zBA10hW|AsD^fKaMVE0P-@?P8X#y^dJzbMz%)TI7+@mlfromDFBnCPgIp#PqPPKn9l zQfv8N3E`g)QZ5o56lNEbTMT*%bDxPW zH$}=a;qEfUK;^Fe4FY<$w)h!(>!lUQTwFKnmjBgNnJe&fg;Nguq0?qo*$boUz}?^T z9N3Vhb3aP^S7!pr1EA4da|qi4)jm0!owzvfKtrO#*C6kw} zb>G;X4s#TU%J}PtV-NLzUH2&+Wc&a}OQ=FN1ZJS~`K`LT^o9V+5BbnMV7X=`)8BXZ z?B1f+r)v2Ov;F9NA7yNlJ}7GPW)X%ebx2s&8bq&Om%TZlkY~4k9w84M6f3d#3R~%9 z6ge<{Pi4X>_l-4ahF&kGd-M6=uT&05R@Pe1<(_9dxnllc(gcoK*GHE10-Fz!1F)3^ z-dvA;yStu%ylc%v$bw#^)s)wlGR&qp!4_B6WGow_xBOvoIqG|QZ`+s-yeAUsqP#9J z?cZ3LpS$7WWLd%YIfKCjh|huqWm7o|;$Pdsk#ChmHuwVC>i<7s@sx*AjmGMJwtpU*O2B&qoVIo*Svy$_`P zt>82X%6HbCQ}P;hr)IWgwNA^)f*KtD_Joq_@14%SbNbqZUTE}frGV%8Ur`#%JzZ+m zGo@5({<-j6uaHlH{T*oaMV4wHoL1n+Xiug-^&h>azM40RRrjhJzrk(#?*giu-MBGT>R*?>@$ux~k(LOsX)?C#MzPEuP0%+U4lC=VJm--9 z(BV$~P*kR%c=qNuW8t6WBrCIafu2&+6~=a9%y|1Co7@ZHIhCqGxiyf9HXrU!ITJn` zjocMNNYig)J;^kKBi5w&lrcu>JT!r;+$=jTpuHf6+zXsPx$hv?D_B#-v8#6Kp!v>E z^~1kPpbhutFm+c0r9fV>=yZ}5ztS>Qg>d|c4DtO|MK(OW)r12 zfg_0v(!1AjzWWc6y34c)hztd4e#^Xe6L)bpJ@t2L9FV+F!WifDzv)VoddVA*T3>bn zM}bFZz;*c-MeMb15AuP_-<{{I) za$P9fJ1L-DICpaR#y|>9vut0%V5O$oJw~DqiRIVY9xtJUhoz;&9GAPK^ay|j*O~M~n4TvOl4wML{CH+%{xMC(8l!mL$o4-ND!H+!*9p04Dw_V0b-`fKXWZqoKa|P* zl^7$Z^V#sf!Le_N*ve47tHwQfTqb<@_D+eI4FZ{fuVt-B+VyIR?B4QY)y zqUmMg=x@cz5MiMDX;E(Ub#x*GtgeBgXlqmq(M#`C4ux(zq?~5A5TYn|pQ!)P1%L-c z6sdsFc3$IrtB@%?%ktmwK%OUsLtCL=JI+>q4Kc0yU+JAdq99oFhER$*;%mwf_^VEYp@Ksbs`< z5Mr5VHA0F_;zNX^cUNPG~3A$uk|>e?2`>#Q44n zKFN7PBKQxwKTS+;A$@hH1qsETkgPofo>mIDLADxUWf_iv5)*iA1CUFPr|iNz*Zjf2 z)dSXlt8OAP!W%W2<3>bGd5E*V^7RoQksIG7`~DFS8SwKPxDj&o)B)A1Ud?V^>;W^3 zWR0(#MZRi{g7t>0d?pjP7l+-(W|dLP^sG$uGX$6C)$Sft4E zozK-gy8)6FtQ}OSFL5?Z^~wgaikbD`yJ^|#4@5H4@$vSyJ*8MRA${p=VFG4;bvVEy zI#+ttOY=ikzuhUW3YA``E|x}Gojw3s8Z#53FGQ^HO`U(#)@NixKIeJ;2R-l)oXbl2 zCz_gAPHL`p@ezP7NRFVEhg0P*Vouy$Ne+WPL0M>OH7mKKDd+ugf6O_bVD-19Lp`LvE^OJj!eYL&8j%u>>mHsqwfs1kws zUkK4`f`$0AbRscmCCvP%9PU{h#%NBY#@8B<^1-Pb6}TPniA05Z<#fMmks|%6 zXNaj--gx#wJ}l)}q08;iOBxn<4*R-v=YxYBrrDV)J_eKjop)YlEHzuiYAuK)j&LXb zXDUEz@~ZShKm|LYQ~?9=V1ag@-=;>58~?4=c)ZAwqD3)F#B8}TZzwUvFxnzh${KO8 z+ICULX9{lG%Mle?jJ>@N=!Q%`bBNG7D1K|Q5d!)kYJ`oOR@%yV813b6*PCey_`2E| ze@QdLvvkblAvJ3^rP`q$aT9jdg(5J4tpS*SBn=ggt3x$I`cbSR4zuKU$y8RuIVPo> zB7yHlH>J^dNg^~JhChb^sU*70D|~S&K>=0m!&V-Hre4UGhyFY>KZm9 zI*!#ie2*%~lRB)t1@VmmJlJ|PeGYcV<3%!2*8BXivU5qCe&MI{jKMXRO0wiF*dTzQ zNx(TQl9j08!p0>6?OzI|O}>>ehvc?!N`hphc*^4Lf;bc_nMiPP*uwEj|8i`OSb7(P z%df-O1hwsNxRO(GL^=g7O5gV+^|T$MYlYgUL?_is?W?pyOL)=e=&v=i~TvB6}Zhe{Gr6n{(iZgq%_Kdws)Y2l|X_^NzaQhE15F$ zJvmNG*yC#r;1IrdpwvKI!JY|YAaP)0O%lzsD$*>Xja7^qVpe`fOxJS89a9Fk^_0RTY6Es&0SrsheD}bKudA$oHzL9o6v6K|QR9QsR^-_;wQPiQ0@(yI8JFy;5w@jS2I`hEJSzdxCW4r_Q!R(71 zD^368_iu=v$y(5tNIrfBuvn_t>V+70P6_vji^o^R1Nk(4l zEgnFX3vy`!$y%P+1(o8krO*5(mM>G&VnQ5S8JTb~OS z^igUIIJlQnD_{+~9j!uo;Tq*dcLd(o_1HbycfRhu&KuA9hyU(TY^H zfGqLC&WqdoPS6y-qS&f1FE?{HITMA1qGmsEIpUok6(j^kgqI~a!X%&Te;iwPHVOGF z_4m!2{Z7F1XwlN}h$Q0?hN9GEXaRUVC{XeX6rt?&2mrutxt^U}tlwRo3DyPWKXGoK zE0pJY*V}P?T~^;u964XsjKiB7G7s+;htH>yVQHqkkW}mTwrQQ>J%D zo8KSRbNCAZ#+-H-bdJGbztZ!aXe(h(dmw66X%KLuUPChVVyu47bukO&Q|SH zy;c4_o`d&vPHy~O?+c<`WpXLv`n7TmK5UaAC;fr59DzfjYeF=&UazCbGHuiK;t25l zr{!G+YDTzSj&1XvNJpJXZHFt!iU~DghXhK zKg?Pbej4A>43{u@hn6;pp2D2bY$;36|@ZuQ@$ zZ=9Ewd~X$s9V9|?Q{I~8R5=w1x@2mvN$dUwK4%ELBVdQ22GoEx_1&Le8sW_p3H2#|+f5oOc3HN^PL zvUFzX{zD*NSY2J~iyP*7HSo3a#6-KDI>x~Vzq_EBA3*@|z#(UjZ8=~}d`lUetAH9v zaP0CbTsTRbR;W=r^#z|^t_4;Q{i&-$uF6BUB;7!fA#QmERY+}t#>I2Kkqh!GKuDrN zNq1VtaIXImOI$L%J@Ti~pXsq+0mF8buukDaeju%rVvedB6$Z+{UYHXJuT+_;IVkY9 zq4$6KH$@E2d`%^v;L5>^cAzhM1Ip`*+ac-^fWWAkTxQ4u)^c|*mQ^`o7kY7xLN<$X zC6RZQwx$ld^l&05E%5B^Z1kkU6MeYB8Ho^IAL4{AR3Pc~GpuXECf(y17K})O+g~Fi zgXn+TF){zEIJTL#@~&;Lm^l-8E>T0+VHU4WLo1nnqQ`B^n0)^TSi|$E^&I1ELNpdE zNZAH(*$y3t{N2F}l3(@T5hPx4?DRKyljgCyumfG4Q%(oRRGLgOatq>`TQ9v7R|cwm z(i>@~Idra+q;+tGkTvib5T=e9eh+)V`<>svnVNfbjwkvuASbZ^88q&-=$-q1vi3-s zQiRXIp1eQr&Wg(jNbh-R23`lA3D*fcB_@cBJqh}vRsBH9(%>&=V)zX2xkZ3C(_RY#lFZS)C}zWT{@r1vS_}E!ZUB1NA}woHz;+!M z#Yo8_Ja?sJr`X_Iig9~of6e05Ip@hjZdVg$Ny}vIy*F2lUmcoz5Vk?Rr)m6k8(ZzY zZsIzaVqfTXal5xTj_Q&&WTGVv=1pp}M`zKZd^>fN5)NMM4H)arX44A!L?^R5vT4-k zlDl>50~B&X4_R3Vx`zJ{nB`Qtd%!H1u%UU%n^{ zStll2Jf@{DXAuQP%=-Pv4y4~a!&Mj5|2zDpM)d7GzzW&yZCNDB80j8D`9sz|FT{7q z16F?=a(7vfVjO-{mNk=ouW6UjI^9|ejSiIdfQUQC3)aVddphYhb{@7vLSEA9d%K*U1|l&Jip+Ei3>lQkS0K+AGSa%nFI4lERe(IoCJyp3=k> z;PxCJ+i^=quJfYtpPSR8*sd|N*FxL!r#XMn2~+T&R!n4bS$6Vu!bJHbpIy@@UlH+e zB9F;(|G*^Y8LnIi(Mzo{(7~1~b&L0(J<=2#VX-WT725flxW~~s{H&Oo;D97KX+I$6 z^I3)~nE`z^XIE4C;q$t0nqMybt+I4mg863|=h`E@UMG0kTg72qb_(|Tnhfb=uG1Op zI*qS@4kO%^wi156PReSNj01QO%YK~&cTalgmG zd?;^%UUNo{TSjqzHh8njnR`U$BXFzr zeZ46W<*}D48xL}vNn006vcNW_na}6jK^I(*{L~LN(i?5EMY6KP3))m=_<#O#zGsqj zIvWjc6nO~Hv;OVK{boP!2s7@r6&Fmk06dEw9O#zw9ZS$u}R8JZxg{Ff9hP7Fz!6P*B^}&Fyi3b(xV*2&zxK%LzqbC zumctWlu*|roKY~Z(M|W4fGC6u)xXe0udYKJ%o3qPIQTf~rwg4RebA;tx>7MqbzS4^ ztFN14R&FJXOlw&Wk_Ov>>SyRTT|*cq_P*poJs~1TY~$GtH^_sD@>792%RW)s0~5$u zlwiYYYJAA6FAim7RFWQ+uY4PovAIGd+!RntaP5>;*KgVy-gy;7_G#U zSPv|jLOE49{BoC9Wt9_ERx(bfiz?jMeV$Mpt+T1~(n8oV4HPPQwW+sS`zpWCG!w4{ z$lSQ3XK8%Y$*8b&kQjUCusv{8P){_!Tw8r$`U>#~P=snAs$K{<)>aC#f58|Vc-?Uq zxSa$EvAq!RiLVC{NFx&AKx%`aqVCR9T#Y*3Tuprbhtq<-$*=-5YDPx~LH-+PkUB?*-^7Y#nt-8WDWIrRCL=D|oDne3aw)O?R zPds*VV{%CYeNH#HYfKSj?B(uyBXv`<>!Hix=w2P*n-MdF&l52f8>sNC;9D?ZJ-aVu z9=`)C)w97YOprV0Qiz=)zi>pp9CSEIRhPL$^i5zo0$Av4+Wng9bqgNwo8@yS($py2 zjySXXnVh3GGSeS5f^Cy*~*HQH!9-jZNx z`f)O09Evj2veIBJ->n7J^@XRN>`{ zXJ6?kYDK=d!vCuQa3n#<;DG=tUjlJ_lU3V3T+jX)q6;0~UoyKC+*++IM~YQ;DZQ-8 ze#=6ARGYAAZ4n49=`Z^#VjR%^z4C36m^u+s_eaBVcq^RB4m<)lLP^y8& z@*V*+fev2t0x_2$$_ky>6aJx^wZP?Ov+MFlK=iZrF5S6K`b}nd9o$Gav(7X&O)6Z^ z>mSY49CF4bD}b6-(y-3+2u>U$%#2%eLL8B0U7Y!}-!1{k*;Msn3_4goYrIp2roz+dIMGB@ZDgwj(=v<7YU}wRXP_ zqKtSZ!C?eK8fA}nU7}~kYZ=}M4}?Kpg`Gr}3*e{BWMKk3%ux9?pW z!_pvdtZd2JPbc?&m8@ePMA{-!mpzj_^Gf)Q@e@=_hhd;wMFN+SMv7c2kN6dDSa_4i zI;1N#wx{9uiH|OjJ1Oaocl(OxG+^`SJ|uw?>(aEMxeI4T1UAcZalFJuB@CWuoc< z8GOZ8k(CRSJZpYkx6ga+Z=3g}7cf@-xR@ zO7riC9}&JHcqJ?tHj{ZB<;b;GNLflbT#Sv}kCm&|AiD?Q{JFN0%ruZWftw~aGcG~= zO?fBAm*1vnSwAoK%o)k`NeA_-v{cftd(w^WZ|IuO#EnkEE4g(IBHYTMmN9I{1Ft7{ zrDE9l=i(-#c+e&Ol!O9HeUP39ezoX67s1hN2mLTyf8RCd9vJzx>yG3?=N_FZWf-M& zf-UznEPPkvOV^MO66pDj%x$*RaKPaI02e*$O>R7Kb!~Gb9wpNymf1tg64?x>Jr7^4 za8P)8(^Q&Mq)$7~bs?F|xLkS8QGf@aU8mRPHR)anu^M-Wbtx__jlJx#GRjMq-V}VT z{(b7zINMSjrF&fSj~@I%_<`WtD|@xSu)RrVOL7gcR#t8o>N8aI?}+|B)a6*tsbvXc zwLrB8CboV!TB~?6G6&4MjixUeoli9cm?U;>&QvX9mGJKAF!P)OxO~6|S*zj~vo|@rWpehhJLj zJTG#x>~+e5G6QgH2qk@DzT;Nxw;SLMX7gLorkMW?+@N&h;IkhH9yw9NvTRPvgmnG z(&*{ZQTBaIazU`UP<{NSuO9KtK=?OSIU^R*f9NKmHFF6PL~P_BkM|8{1miVzV_Dh3pGSCN(Iog?;b{u12GcFOf72!Z01D?X zqf~Mf0HdG-7_JY&{{XZFuAks-BTCdX`PyqMWPnQ<1UA(G9D9H&8{dt3ROc&abZ}1? z1Nzgc8A<4bq>j7An~PfUmHR55nC{ind=kO%&a;DzYVXHy`1iN3Gfx`Y__`p`2872S zma)Gl87H62*QI<51ZaBbY=6jI{r>>v+S<96jojI4k;8miw?FW|{0}i~Y_W95u2$>6 z;riFJd@;R6_(ouCf5>Z4W1o3{`qksV8A3(z>%cNdLPl++O~l{=R$=_uestRpi%;NY z)jU6aVAmG$-pz9a$lwqpZQVJ@{{R~5le&+ghjY?(vZRm*$vuT}zAXO$QKycdyptc2 z*FSafzfO}RY15PMAnR1m#27qPbp#>HuWo4*+Mf5M@< z9W!GmPM_+J_}A8706cdWgui7!1KZr#{kUo@Z4tm9xGi-k2R*WIKN|TX<0};SQFk96 zV6c>x^!?c%*1J!HpB-iJ*TUT&!up<)nvJcK39Y18!znN3j@;qNHK#IE)%%Gz%_Zo4 z3$03}i?<4Ef%t@=jTyMX^S>YUbRD{e3#DJCn z@J<@G zf_?~STBx&I?$dH~bjZ?a#&Ya4?!n0njg*z#o+kQEN@hzPg)V5M&K!p#V#5 zmgBEq`DOkU=N|~1#qs9pv4sBCIbeCu_I!WSHNQWLB=I}J6p#ylB$h?aa!xXH_zLsw z2Uok%J|%df_Q(TqW2wU`f^s>ug-%Dl7=CpdrbB-6KBbf5R9cp!srYIb)P0E&+5Z5E zoR(4td;$PI^;boej-dh*&zdqi_pdr%j+a*(o^1l#&)N{m7=|EZ<0NMslZ@3g_`7}P z`LOBHK;-cIi7Wjnww|c9C)DG-Z3r4&s6WH2+Asb`QT=~f_Rj!#$@~%Uk3zpoV{%R0 z@RjHle9MO{c;^B#G4Ea<&q9B#bzT(slc@MtMjAZYRi>?{ ztFx?EYq$)OPCfET{Af*S%(N!$_Xlaw?GT>8w;$nL=A+{q?-)&Px3R|nfU%8ZA1EgoKaK@X`x-ZMGvKic z@nsGP{{V@#;RF8NTblY4!k-Z4)bF+39ym6eHfXmv`{iAbk?G2QM!r?>wy|}jc$Zex ztRz;tvel(3cpx2$58y^e=U$fxa+n z<{=Qav)hiPPJf+7`Xo}4IuD8b==KMp7i0nJ@*3cLDu8@J(bqhGYr&q_<~;uZGgdGB zQ+?ud6j#cTh}g0$V*@?Osv4uVpRc{d1VJUc!!m6j#v+W9{{Vew@~vRK*?f$pFL^W7 z^sf_4d~bO8vEd~TgKTVA$lJD>o;RnHEmhj=`auYLcTFgv7J`p)i)}Vp^l;mB>w=w zTl1`+2I|sip9*hpVpK9gsmj@ru%HnFl74`b?~GSX@Yheix%dI`a_wQ2#mUm$W!P}V zE}5k{@3mMH=m^hR@?A5nHsy<1O~Eu$qR%&;!Y_^GV`O6oR%{{XV8YFa8aEUbF>#qC@sfuv5-Y*@9sX^WnrRV5^f@lONX zEcaduy51ROHgc97IVf}a8mr>Z8((W$O!8`)q*6s|6Fguts)K{rbv1?H&3?rAAH$Co z^dD)0!rmrRAPp0wYOJIakUMblV{NuJ~6TX0EC$6raAuFpfNsEd3f8q@8caS z(InJjlS+;r>OmvczEd9*H4AwI4QkuW>6TSNscS4ex~fn~2s}&Ge74hDQq-Q~8SX zEn~!5Y(EfPB-A018o-8>I4Wc^ZY#Ugj%i}?%(e{QVAUdq4CH|01p3!kywa7r8QnJQ zeJ|kM4^Fdo5!yo#bMpmI0p~U5f3@AbT5rQ60tJu#DVqvE>6>SY^TF|pUa?)#Yq7`J z5x4o*4e=+(x4tsbFUF&*3+cR~u>l}IF+QETR?%{8T^YM0>c59DZ6rY~(Qs=G-n1(W<|MJ~nt~N6~HIxxL2HN|j#BN#q`cWQyT@Q{(+I`(C)Z()Bb& zc}$BY@Qev0`qFAop-HQ5eHW+OBe7E$B224-I)X5B_*c68FYsT4Eqo2F>zbXgitY<( z=aPI?)gnK;*NF?zG@#Yz_|vW5S{**`#B#ligb5-N{G@a|55}cA zrLbN%S7){0#o;*0h_^+MyKOWiK zToY}7Gzv=X|_uj*J=o>+WK)5fW1aeJ%Hbqo@Dn+D^OD&NGfi`qwsEVQ^FidTvo z_%0=VnITZ*;C&5LVLo+uu{p&->U-ygu$oq#wNm(e!*>a+epicc0B$9g$Z)4I+H0yNw&{>nbup`$RMean0jEID|1Pi zA|SJ>0m&rbabGL0yRRrAQ&GlAz_)(Cl}#?Au1{?4W4>6_V6#TRe!oi1VdociU$%=| zA4~izxLd6oRFxb$KCybrM?wszn(m3?1Df*x0DuO1$ZQeXhV z>GZBDiq#r7run0D=1+}!9QyagyA3|f1E}9bvBF%9qX;rjumF?vta-i=>Q;9#!#9d_ zg_Wi96%=)oINQ&B@%67k@iZoH+JC`OV**fDC%$5F{VRLLUkh3Z8W^sgA^o8D^MTKp z#&0wMpS!g2#d`6Zg*9!DCdsyWRKEngLFR~~*6o&W;T~2panm^CrD1EH3-K+7g*6ub z-bpQ12a;=bh%WR1mKp2NcCVprL49J>laSJ=B-fgFlMmqiSsAu()8z%ZJ98UzSw^(^ zmHz-ES57>v-M^I7pHBkQ^&dF!N(ttM?RIO2f=Md>1Hu_t_j3a zv{HFiz=e@d%%`59*Rgyy@H`$U_%Yy%>E>;gX*#MQE1bK4*&fF<%?H6&-VU|9wX>FK zA)a$MS>JZTRYnIN?B}0a+NDWFyM9J$3i_TxJ`i|^MtJ9s#7nk8m36lq^MVLJO7|bx z&r844{4KA?sNEaeldVYRaxu6YYkYCr(-l`O@T%YN&v(=Al3y0h z+n=%n{{XXBL-Fc2kK=d42RJJ4GPZi>Jbya$1(cLw#sIE`HlZ7TTA1>u%>2(2viK3H z->laI#J^{>Gf4z3C9>trdxIXh11k6&@U>z70cuv6Z}>{&E!QH^LG}Lidqlnsw(%dr zYbU<5xV^Rh(!3@sXWGPxrd($ukDT}Pt}yG#Y2z(FOoPK$mT4et-`o+ge|IU^FvM;p z208E2j%hV@`5{>*a9XFr9cK0+r|KRmxVY2q&e>IBRcrzYA5N9j>7M|l((RJoFBR%( z1Y>F@)HofwitBZC!r3=tEQ9n~>|C*vfmp_JcZ=K68aOS_ntmX7Q(N#>singgiSDjp zyPL`eL{Q7}Gv|+FKc#yVe*$iFEgwm|);xcGV|jZL%$CqVvNGiZoL~}g4<{HE#e9Eb z4yED7;eXSkDsh~H6vDo&*8D52TmJyU8{)kh+TTzK;qG+Ec-9= zCC14fQDyKV((}WSYMNh*b@{A?vRuR-Km$Z@LB`yU27$;r{>;XjZnqDb?QB zP>SYPj!8jf@qwbAVZ~!0XR7 zN?+L8pA3AY%14?~Zh3Bn(QRAP5y3dWgO&^Ig&#;8B(Jd|JwYn?{ zVOC$4X&E3B$F*^~up)Qe*T40xszuXF%$V9wUWdz`EBGk}k#&7%7QL*O5pRlCy<$dG z5s{o68s~lkd?J(LjfLILq2f(m-rmB%-`u=6Z@X#RfI5ycezoqO5+DoWM$Q6BXA#Ks zDOsPfb%I>@PsJ9AAaQl!i+GHnX9cH)bN>L3boQ=D$@3`Rsj9NOGHpL*KM44?-^q(v z@fGln2(P@ILgAM&$&ivLDtI_P^=ni8oOG=#NV~a*Q`WcIMdoah{fd=dqZRaBpTW!j z0EcO&>Oy#)%Iigf(s;&qG|>*?6Yif3z>P2~s^dFQsLimyz3U z6?4EJHFkPu!v6q=z9hJ{hR6F}>RF(9nklC{t+u#Al7shKcHxiqO>2J4Ff5YFgXY=c z>tV}Lz_mYv zT0NzOPGD^+SlyC{)eBHe(>WzNd zD}5hbZb$q}?l4bt<(z)FuL;(4J0I-pU1e@0I-4xkW(EUbixD_~_qPH)F;z~ao$mS* zQV~g69mm7pg8mV)ywWXhB)x40y0!?Cj@z_2h+87+Bd_W4&G_{SBSK~ zwJZ|bhk`4jt%W>|%eMscQ|X=xz1HCHcB!Q5hfCCL^jK|+NeGo*Ibnpb!R`!dLCtzK z=YfaA&kbo_A6Z1}XKtz_&QC#{`|(Lsl8w}cqPew4nOI%MzY+8=4Qskym*Ni(-$?|G zWp`l-IcI3qfeW0e86Qr1)h#pP_P^teT1zLk()8^YN3(mIEj}$W2U}F%9AY%whX4mr z$M;27@vn$m!e0}7H?74I%_g5^16KhMB9+ zd3dXJZ)rWqDFR^mXk3Hxj-fGLz56hDS`P+zVKggw8h9-&pFx z6zv2j_C~3KgCu{U&5y#LHAMwJcdwWz#_l|;L*>n0V=O*nM;Mutdq}DV?3{CtrF9qI z4D?tvO&>~^Pq@`}o4XagSfZE9K3>?_oScEdl|UWp9~F2`&rA4Q;Qew7xhB8WR{ATr zn2nK`Wk8!oGs?-6l6zOCN#Og9Q(5rlv!-7@m8#omFj|QWVnFdp3@pH@@3|F$sFg`J zxtJ&`K2&8|{?C39)Vw37>z20iG#7cucW}zf!BPp}gOT_e@t=&J4s_25USC0Iq(+v| zT*O%9sC~H^J$jn^hg0xmeg*hjqv?@OZg&=$qH zhaV3#m9{ zyTRWKd@-wC-!;yMWiQ#|Qi#wlIbb=fU$hKro-ol=f&$&?$B$7jAFeB;_;eYk*8-e5 zw^F}d>rF~dI}>8W<5^>p7yu;iRUqJU2xDDu!&#)0!*;)DM2=V_metlWO6DnEER6GmvpubV^*(=*{AjN!a*n!`>UyoWl_(tuKsTc>3T-B zYh`cYJ8Sy`9BnPrA{JI=$9}lrpJIN8meET6lUF?(`&REf_5I=J^{-;Mzq7E^ZSAMH ziYaH>kw(M<$6#y^$o~M7T|Cd4?7^)H7MdT1pU8?&2iTRC6mZ7TNsOElr{&`WpUS*n z;(vnlod@GKou^q?MFpg!$Y4dnkMw^q@#q^Q4}4eFx+saPq$O0c^O7s(?~RfF0LAjr z+A)A50Fll!XWqBweF){z-1Rs-A){Nsh`Md4R2W>sx&Bm1;k`F@f3xkt9RC2SU+}Ac z+csWnLM|2EKrE^=ihtXol;H_~pf!%2%jI2+9c#lnWV$`leS!gq%M3;a2;?07K(626 z$!UBSWg`>4r@0KI_xnVZ$@q%-Ep(fr`G~Ym6L=sN+Hf;nKf);6Y4sw}fH5iDrfMpiFKuq>EdY8T>${@Q;DCOP9EoO)k~sjsoGD zB|Pp?>F#QOjpec6wZ?O=My^#~o|(a}lj3K=tqV~2KjIBQ={A7c#*C~Y0f8>6c^=Ga=7FkM+%ae+ zM*{@xImSR?`Y=C;uJgv)t*rk50DN6)BtdW>Ndn_J9%>W)58+UoXGCKg*!aW1-X7D_ z;ctfAS->6i=%sP6e9p)TC+bal*NXJ}e+T?W(7Z2YqFP?*6K+{=MZeqtHVE|lsxW`{3~za?wxV1_2fH7}t{DA>a>M)A0WQkF=v?w`!6{nM`uT=vCryj>TAZ zKf7`D6^)zGBJ|O=azC{$?4_JZGl(v*1sI+fH)gFA`gpd}AfH5I(rU{A1BXZ7qVc$Rp=y;B_^$ zuAr_`vz6ClNzyoZ+NAd5rBS}}?Py$wG{{Bp*ob)N0^*q?Ai2vl9bgg+jace@|NLimsd;-=Xf7#>1mg>mPizsymB~J2ie*!7GidIKROby^H&TPqJx*WtgACso zz7xns7tfi09ntan*M5o=_W+KjyvO#bzI`9YKMplDP|as8#Gp4qRiQYl*54m3ry&Byy)C+P-4dJ|RRki`$DAzp@j^UPzH&8@uuaR{sEnfg`JzpHz`oC5p!(0DJmU z#hDQ z>9%rO*+mwu1n!_LA7?7Wdkpj5ijbR(bQ~&17fky8^W>4TdG*b6-X^5L@^A4E8^&WYHk}#w^;6kjM0^l&3hTzJf_6-*el1d2t4>tb=S-l`Rqnc=3Y6CpjHY%sH+{ z_8{>EmV>7}chfDu+q8(_h_(U;TbQKANf`N2tBSSp*NAkerjFmiI@IhG>{%lUr1Suu zpjRp2-DgwqUx1_j+3?P#3Rxp8vqpfZO~it7axgFtUYV?YoUL<3QrAc7FONK5qw0PU z(j$jdvXWJdhD4oC+yFg&tHb<9;wu|%7g>rsm}ZvZ&TDiQV%D%HS_nyU1A+;Q)zA8B#I3` z?Ay@r#59fD{rqRzyw=L!#hQ-Bx9~o%BuqC65UE!BcdtPBQQ=FyPU=~FRi@tfa@yI^ z{>^a%%J(BVA$9|Uzy~~YLWJb*S2DGTKW5!}&q%m}Ysu0GZZt@3)!5-fW+%Zv@B?34 z+xXW&x$tb(tFBlE$Y7snO#c8n_(#WA()d>ERC|3IX|%Xq-_4KrVl*tpQ(+kx1x9g- zsixg)`kYZEhlMWgr*seGM{qYNJu}A@GN#kI9XX_|eKX?U66q_YYOp2z6H7g`uq1If zVp)`^>FJvA4NC52)Z(n`HnyW>d~RtKvxRZ{F@$r?3jhp`RaV&VwYe;OZSgZiwnqC^go_1>>^R+-Sg-_t z*Gy))&xN|puZDa>b0yo0YiVqL$+?FB??%Bt@CxWWH{fgE2KbR~B#P==YdKa}B#zjr zk=F%yCxM@@O3t$QZK7+!=H2{Iwl@%*t*ym_gSUf%#lXnP{IlM)_Ht{Lzr>zvzGQtJ z@W0~cgY;Q0UhBjbR^g&MJjpSZ$m99fmw5N$Mu#n)u9jMy7jxZO&uoG`F>f+9jP~?n zUUhBox5L-h)7o12pxsFVBNu~7k&xsZ@?2w(0MA}e6^ReS`^YsZM6pPgiMz|0Vhmdc zjIQB~{c3q7%gc43)b+iLtw#Fp<4=OY}(v8-k z6}0hM!2_e@VWW*upZs>bk6qDjtXeCGVRHhZjow565>Fio#c=XXtjxD2-%GY*1f?Bj zl&>S`4tOB`H0MppD>7p~UD5X^j{Z3KD^>8ukqkQZv6=-dBw&(9%A?c$n)!3%r;HQC z#`96Ilt~r7pBFM(tO8ErlI>`uf$YPY3wRSefInveRd1 zfM+bspl3blN)O@)PTC(v{6zS_;r&xY)om;-(GMwYs*mTR9-c~FgeHJTz;?cBjO*3Y;B=i-6q__aUINN9sdA*2xRIHLOOS@L&bLO1HG8$(djTOB{VTA) z*L*RnYMOQKpcvih>?DQACu42focF4F_rQ-9_yfYXmk+K(eQ|Ys()_W32xkPG=jO{1 z*EsgBE5Kd@@h^{bi1jG-3oAHePY+=(>d##tnzYbf%%J(uU z=Y))sYs9>J;u!ox@k30$f-@bx#KjSq^Mti!{4-mF;4g?64c;TP2fi$i{{R(NG{1nF zf@*d*`lh`d(%J7Z#SON>mQtks?9K*1TIPHji(_-FbCr)_IOO0L?OWO>h%7v1VGGy`iB#T3s#+FPnCD&Hx^PWl z7~WS#l6Ew{DcMPH@aFbb1(_ZuQ}4VF>sx;bWzWMc0N}3VkmJ+$&r$qnP`?W`0zZe! zAQ7H?)u=uX+E|cOr zUk%42T@uMWMkZ9`;~@V4L0G@Eex0alT0exK(=PtOeA@ghmpIPMTigkhC^2kQqr* zI6XlG5$#kwbMOboIyZ)H?-Ru`%&QnyLu|31nC%B6+=2L>wKtuu&Ha7FC?xKdqr4KH zPs2|QyWk+xq5lBT1$NQ=TGC$b-sbMwadiq5^ArLGcJ9V~c8c*&0eBC@S3eGPMvug^ zT0tZNSgk~A;w52_xj8+@^sbNo6yB$Cd~~_|YTs=!i5?WTP(t!EpG>JAg*uVkf?7yTW1`q!7({597s{x55`FXAcSn%2<_(?h|K8C?SUV=dI z_GtmW8Ad?=0GG-C0QOq-DHk>6zq47-!*%EWUuGwc=V`B0Zs+r&uf)YqW9Ofbw&M5V zw}Wh5cSCgX$085n20}kkSNvozG$+;#mWyaCZ0;h099s{WOiIi~0VM8X0qMu%O!(Zn z_~G#NiNN!%`g_iQ!o5?(N}ha-;1Wq3bjLN`+KeL4F-GnBoH($yxQ+=P$s=hM7{?@F z703jG@6BRsT1|v7>ek6^5Vs351q;w}F#a|{(8!Oyd`vB z1UAce;x*_|t+GC<{{Z1!YWL9SJiqqNeN6>BjJ*L~W zlzMXch*U23XvWi?_+nV}&3VV|t!%4#@cqc+&AjLS{8!Q%kVWwJmZPY%h%r991$qle zN9J=Y-d?AY!(($LsB73_ONEj}!VU_DArD^bgZS1awQUu)uwqD2RgoFCfzDKBySw9( z+2@+zd`mNb!cQP0l?=ff=HV(v)w31&(FbCIL{H|*^hBpf3biM{{RUt;gG1g1n_^-E^FAl zL$u1k0gjx1D(RoZ?n2o!&$X*{i%7kcqOm}XrI(@Jqd$=~<-R$LH;giP+7*DvB!UnCi~u+;cn7u`wymwL^*uh@QL&X}wz`QXiPw>hW4N4UBR^+$ z%VV9nP)xxzX0NA3&D~|=SaFWI>G^m;vyghw$9+Rir*h3-QRtUo9>yEX=c*(rK4C*5vE0}{Ef74Vy%nB!F z^aPwzx!}GoRd0xvhhpzt4o-2-KGPQ!>mL&>X3=%O7SC<3Hk5SzE-Skm0kg}RQfB!! zk(S-D7X$n&$~;$aN5l(gi3LBgWMhNe+{Oiczjfi;9YV_D_U})EYshju=RjF7c)|Lg z)}4}S{fXt2wr7yRr8Ui!t;Df;b4e0AM1O^d1dqU)^N)*rk?g21Tc5&<7d^Do&Ymh(fH;4pnVPb{o* zPwtx|74%l80>`Js0NRMS0Cx7I<+`vaz3zE$jG##TJE)MODyT;v^wEFB*Uj41xKD`M zo2em=jcnN`)@jG|ucf?rLilG>0AuAr^&VnZ&06H({71Ww9dt`${{WHa#Vx{4+8;r9 z$5d-wS{oaS`;9Y8k49^&f3r{aVLi&o7h#v6!T>eXBAFzJrbI(_wTDpI(|e1J!|6_xSY zK@@%`-Y~z}<3CR!Yq0nX!b{z9G65z#a&kHTJ}EYoZbq&~&x0>KL385`A{}6=+P{X@ zbr4AGl0TZCGh}`IXY)0&@c=LUBKn&UH!3C%q4O5KHaj@ZjwHesj9_|!>0V{=9e?7J z)v!3&x&Hvai%L>b)gws9mqvW|Cg$-Lv>5!pMW)sC;!OVlpKAB7ANZ8%+DzIdjF(aB zmxA2deVR7f;9MYJ7y0KQY5xFw5HGs~Fy}Q= zX*Aj*3in8UurV5*MnF8*hxnT2J5LyRg`7kXSjxDWg0AMYAajHBWQ-2y74F_4VdfRb zZ%X;U;+B_ptoWB-v#^BAIffZk7mTVxjK}a$PvKJyWQ(4WWV$K3UjTeVdjlc8j>P!} zAa@5bOc!oB&P8|s00#7#E=IX)uFZ8Xh*89{ODYizu(18nkFWtS2(_?q=#X6NY_e`GspS6vvc?!d1MmR;HS{0FkQc$4yW^GeNXI|&-ZA}a=Ziqkajk7! z7t|HO^(Gj(_vw$qsw<$U(DiF(k4gB;uE&23-`MYMEJeJj3%py_OMt^55I*wf@ULvu zwDi;MAQ6rkLCCC_Z4y0ZMU^okN>t@}9QuBB()g%m7yw*h0Lc1QNv3F%N65b#$zK+P zP)Hixix3C86J4*vt5dC5c$UqiF^S`j9qKc;aFAym>xlT`-cOENHpoBP)&~Q=RV%vq zTOqZx@h#G;Ka#ON6cT>yxWMo9tzYofjDFefJ{f=%R3kVTt}o*{d43MmIlxwkoPXC; zuG7F0%`Ts7E!q)q&?8KNO5w_l!yMxWisU{wL>IxDs~!eoJf6S4O2sQ3H`3_&pTaY3 zw$@bTO6u2pdFnjliu9iz{5jNoRpUEbyJ@3KB}Ijm@=Qft+j5TKw}5&61^hg}!jqY8 zb(J6%8okIL_t3}bUra%1c|NmmBzFrHnyG0b2n$L``F?J|XFPQ^vwW>IbEKto&3_E| zeCVDTvbB+#cDIRB&40Yu7|Hjqn?5aCxBM=BA(e8G>Q2P^XHS!#<@wjwP_O(;!jX*h z&3vKpis0J(Wwp0eQeOE}o}>K%+y4M%tkb)@HJY?eqru3xdQJRpp^>FfRfc%Mu9HO2 zqp+RifuvM9K0tHjf^m`uY~%AJ_pV>S?&C+*<%T~s<0#0P#^bg4&$;5aeik1P>h@O` zJ|eV>O_k*)3wYaeB4p!n^{Q#zwXj9ULoee)I`|Gp0~>B(>Ob1Wc!%uznD~8Y20#e7 z&*NVC`#@TYZ-FMuq+@Pb=~?212DAJVFp^7$1$hoefx0Uar@ zPByU51W@GT1d?hY!59OjYj%h{?%_4R58qw=g3HhIU*==Vumt1zpU$n=c(cT|WV~7= zc^vR@&*xpdtOvR6#a4C)wlXRjcfG}-h2t-YUM2Bwfo{A#aiCgQ+e$>U+^GHQ1o@SB z6Tr`5>0KwmK%?PLhZRmhj!-k-6FB~rldTeTtGxdJ&n7wiIjtXoWXbTC!;B7d9He`X zI!aSc&tApF>{0mPoOm&Z0Bft;{+%vsrSKFhc9)ScJ6;@Q9@!Pl{Bv(E9|#kkb+upo zmAL-^3h6!^6X(owqx~P{1mkhsynb2yjVnGuO5Et`z8m-^*TDLF>GrcrHM36hD4q8e zEOJIq=g+NnUl%PSZ-hFOsyS4MoDceHmB;v3R@W|z{{U!dFxtA#$e}KG0~kLmXK!&` z&&4PVe+0Gbw{=*RBSDfmV$GmqXk9-tngyw~BZjW@$j4fB)sBwT$4Kc#yO#n?A)@sQEJ z8CiMYfO`HkRc$>9rjyZ|x^s{+IT^1J)L4&?9xdYq^xJ0Zlm512{cG55ZscVsib*55 zuNBnpk-jCa6-^*kT-vNj9ADwPk-)o7gY5ShY z*%xoMHz9!IZr*;qXw~U*Q%hSM&+T|Od@|8n`t4V6TI$wP{4&$+lIk|O{?)W#ia|IMu21V+Hi7%i7SsEo2>$@bjcVVxtSvc? zUOhj=_QMOPryip;%eZ`7b8PWRssR%&8Ally#w)U(5^_}MzZG2DmO+z}c;d3X)`k4Y zKW79m_zL1ObF)#n0OO2hNA#~$ZLx!iQlNl+j(zI`_Mn8^ zc!$GqMhLi-e7MLw=W}3wbJLiY)IKihH$|E|Yp_V@%A@+%l6*b*Wp%9hEA`9MlHzl&Pc{d9o2^&2(2o@ zE>7?I`-qIBlG9VX)4YFUti&xgwZ1nx`JG8P{{R7Ai|{r^T~EY_PI9(w$G@I4`d5R; z@KW+L^Zx+hBD(U?xMcxP^{-(4oAh}!Oa z9$GIFUFvdMqn?1bls~WOTu+HU30i1+1=aD_wO5`kyJJ^XMrL53bR-P7t#qWFINjTG zn(|V1*zE3pHR;n}$EREz`j9I-{t^hhPpGx*YvoAgL5aG6ssQ}}tXr?y^l0{`<52Nk z+yO_=625}Mj&2bq z8#&n6?>para9umQwzKoT&-32T9W@@!gdBTb0C)59Kz(+t0=gn_jL7-ax6=O@mUHDi{|8^GSn=r6-# zvlZKN`|9uu-AQ@I`r!efy^khB-HKQ68G1Fx|7d<$85Er-Q1LCcK~m-{;RAsl*=*li zlzuKPb(6|Xd58GM&wkxiw-{A!LJx3a_%Lr6Yk#28+UvU!{+ouWs{ceex;~mbVSg8Q zdT0T-WTI{be6QORvmft=cC~aJuZfxlh(e=l2YB8;RcN)7*`IB6qlL+|&OjbJbFxFY zXVO=m8VLzs#CSFv%X{wwj;NoPSDZw{!}IlqWv}ZrT!GjL zMk)uJIQZ^5GTa+gR~2bk)i!ki>+ya162&RX?9JnKP2O3Quto~wtZcjAhEs{w+{Pw7 z-bht@<@K}B`nEq8`N^I>8a@;#nROR!>U3Gq5|l8bHW-iEOE`79sbWg+2Y1Mum2g9I z?Te|2{n2FcI#=rR_z#qDY_U^>Q*2RrKMQ>$S*7}SxcA(iip!e=XQjBA7%q7!6^Rk5 zxpFg#ShGfVayi%A*`?aW;TEqS<851ge64SuWI%6JL`k^#nbuba_%ep>^~b+FSRsYU zCC?i)@YO^PUw&(Q{2j6Gv7lh;S09<-2KB!x(SkHsT#;4exByvGSIW*z5y#3grui~S z25C0$$M~4#wVVgU+e0CD<_a6z>ZT<$=G4rVE9@EsER#VPPZ<#IOP^xNDL4epneDP% z?(<|acr73;>Dmn*`5UCud)2=igzSDlZ>~tVYoXff9Uc|$K3)@6@7vF9?QSQTbu6i2%>&^SdH@|t~t>x%bxf89VIZs#H zJL#@j{AFU5o8#olCiAS*(|Q;nnEIBCzS>usKU+j>ATQ;Kxx1c=lM$W!QvUBPr zdd!8L@o3X`EJNBx-tSuIf#YL+PdABs7vAks=&968GmnWzn!vo zgXYcY!`g;MbC$0OFkd9>NflmtoX zzUS+Kgqg>^h5t0Z0+<+-0j76}3?nKPFE>5xNlgg3N$%x>{t0ELp2A8c{*!xl*LpAM zrFZ@3T&~J@9@B7B31>AtAGT??7cn2EIny)ZC6VbhAnouj^`SsFTQocQ5QzU*Ym5MLU2A?@n!E47ws})0wTI ztPE3#`u1Q{m5Qh26g2l8U*91sCuJu0#HmlF9DP&YgA5A<4vsv-&zZYmr#d;oSf%x{g z6ch*g`MLJhHo;V8{;ue8a}6=`*JeET+EhS>YKnh)8fS|&R?+u*WY_F9G-aN3J}YI1 zzi(t)#jBFIHHv8{-B-Aq+!<9XxfyY zy$=tpKh&Eyzy<~!hKt!MHpj;2qMSHyS8>Ws`fS~tD!C=!$>`1{(oafE5S4njfjf;Z<0sGT% zLu!$kAC37nGRP>nWOcJ_@N!=P!^rw{+3vTzi^#WarU~-beSE?6+>_gm-tk7u8jqL$ zu0?SC=C7P+0k1zfEnR-9P4^AD}k^y05JM-JK@HQiL-Z2QM*>rWpZjU5yD#d@HuLNHC1FazB6yzZ#nuRZ6rE*jC$Dj;!EA~FR{5iV>LchT$_0<~GM{g*#znSlpcfTN@ORq!!6ydldO8-Yu zd?{BbPW@hVxG?6~Pc>$$UT&R)(vQy$6e=J%re2pPEh_8#3l%HdNmoTp4TeI7W>0tk z9sX(u{NvnDqBNHD4aWC&^-cZTLCE{KdmSjm@dy-kX_RGO^n$0lUg5}QLqxi>tTjub zEUKj-Pr8I8ws$5ROY=r>4!qA`j-1Q_W2n4nUt2wr-uoP%xNWZQkj{~EzzPer%RfKf z?GO1%)8WIrSp>aun)yBME#sPi4E|xNRQ%L+K8m`(<*0}~7@9>*ZC166dLMv_hD$Bt zlO}%5z+OHis`@J%%W!#vVz%J-iOv%(9P14S6|V|6v;OLAaSSU`72bHz+O9AzP7p*` zOeGE8b90@LbD9X%52WOQq>RBn0JwfTjn86uWr%$!Ij<+Ljc6s$XQz_BoARf}?2UwP z7=oI=)5{~J=RR9J;62^{K;24zZZ=e6w=n*U`X*XbxfgX> z;^sX>^Rk!8W689e|H0?*uk1E-xT42>vin!ChRb0P3=3QRIn1}tEY@tc{L*4 zjDB~eUO$EoG2}WH2Y>F|^|y3|El7$fQQp04?m)5j4>RH;_`}qRbZ5rx(fCGHHV_9A zcVO9>;zvnAXJ+wpX%-RqABekfB~69Agcvk+cp&70IU$7m#izky6s&Fl>LNHrPU5<9 zXb!t@Hl@myR8r%W`s}I>)@7h6oOk){SgIA_CeV+!gEEJ(i3;xtsIjrRv83NwjY1Ye z`Ehh;ZR1#l2|3~7k=x1Ll{IO*RQx0dldhyrKhaaN9QAF@? z`St^loPD1T+8VES1brm+?&%tah1mw0saej<# z5|g<#p^8PX%jal$D7hrp4YG5ipTa-R&Imp^c*8i^xbB4?vve4cwU2t1fVG`kX(Rhsryi)0yUW+RdPk-&@&Ns>|#qlRu55FWxrMg8P zS91*eunh1Nx_`g&vMPC`ta4f*e3fld5qg-$eCy{@G3Q5y3aykx-dPE_q^$ac9Ni}I z!RChW#~*Ts&GC|i0OVERKRNxiQqzC6u_<3Ro2I!5Vx!0ap2eE*&A2U+Pan*y@rWb@ z6T1zH{x@BnJ)eRArV4sE-hcmQCe(V=C@Y3&hiDWk)w1vYAMR;r)BA?bGRUcP0l7L&k9IZyOnRl@7k=Vd=V4 zNnCjTf`VbIcMtYQ=U03BOX3LcjC$KcTwr2|63d0}Qma{`35tf#7e=KAwiES&$U=Hm z2;xgB034>TL0@TaoIK331^y4DQyy#7`2O1_ug|5irK4$0TvBth=)WIFCvR_z9co*j zBQ8&?un)uV8NHEYUT#I6&xvzBX{8+K4;q=z-n+DTcYrqmF0lOqZ0xRo2W^R4Q3WKo zd_UUkU|H<>*>7|`^wt)iTiV8TRGXPFwuq>pN1|`0*b1lwp!UK6LxgjoTQy8B8Tyy_ zl2PmsaAHz4CVFFwBJGY%1gv1!>rYUbDFE9?X!BTR7Q+FJ1AJhkyswO;{|SXM#;DqI zr`*q5Ptgu0KwKNjtrf@Lk(Os`1C&O7FAY}pI&B+CDkVTyTr7x-^>N9WL2p}ybzmhj zU@4iAHzi{e)yp{^f~+H^0!9gpB>fWn{}tKt^6iA5r&@N8@8+(>?594@b!2I! zkIjJwY=hJM>JVe{m$RBqBXu$rcPrBDoEuKRVuL?cK=H0^2n=0GpF#Pa;9~aXf#!%` zn?xGpnT<`|xinQKEC)QkD|nO%N8E*D;&<>T~)iy!yHyZ(t^z97maj zBiEU&uo^s@wCHve9)4I;|CdL1DmfI@MwL@G?_%o1Ec-i+g}l{Ic1f!d=&?>2hFKm& z*d@I;h`;f+=j49I&XV9z)tWW^t^qbl6~AdP<*w3tAhDM&9BGeJ=_FVR-3qTW?-rN3 z%P??sdzAOqpI%QgOy=AdqEW^G_Bqp9VNub$Ge93P@4V7>PxvgdJA|_x`l@^BL(uOWZm02(n`*a^qm+1`JWqk{rX`>Ov954J=M2|})<$CnAM0#kodD5}a zP_yvXv|fyvd2|wUT94HAE!%L*+0Q?Bajvzen7O1gh#l+Hmzi9!?KffhQC3aOsdjVO$jW%U` zwW!jY^*PUu-U>9->Z98L@uy*i+E-#?KI9%AzS`4HwW!)GQ{T)a`ER*HK!In86P{zN zwhpBpS_7E!W%0{v(-qmKLP8aFAH)U^Of%fxjDik8zvw=iwdP`#3YwR?Il4x;9kRMU zGymg&*Dmi%-7yzA7J9?N@*l{o=yKNMYtptk6ECvmTyB5E3lph1u>YKH+&G2EZ~=q= z)aJ8n-^FO+_DSAf2X}VKLH5wB0OKwW^;^)WM*)SZE_t)%vFfO8 z%LNw5s)R#!Lf>8dmqSUQ%e)Pd0PcRw^LYi*M24=NhI_Tl7wWH$vcHd~&`tZu)4e|B zb>hDIkbYHT^?S`1=)n6vkSmh1gp(7Xg5uS zJ`jy>$}A^i>34Vpjx+;ejlxKeCcRg$&o5d!iF5|APX&A)^j+7W)K8w1fxgy#0x_7N zkMVTO0*694765=-_`pT@eXGXMY_qOt$d*u#Qj~46p%MtGz72WWZ(BPlsyGZ7eQ;aF zmO3}R^3_@T59B;At{1BBGRe3(ZO?KYR+d!syS|H!L&YS_z&Tn^^`Fo`4ud$2 zU5-xkgcl;W+x`RTTQOmOT#l*Cc?WEbl;ty}39KbHu$qb@B*!M(GAD_)ITpp*n2g6q z(!!z@$EBIuH&+CrUWmqj*H^+4;mi}>E}S>b{A&pQE{w*^_Vc-lSNuE6#`^v+jr@*Z za*axhzrPGTWpaaJA64YJ!EAHTOQDyozkU{Z9OcvcpOBZqR*Ti{S(>%=ie60KSUMW~ z6{kuy6@o0d|;ySiP#Q8moJ680JHs*q7Zo9Qd9g0NJ(=Bvy^-2x!_K%>aAY-llh z<-K)NZs;2M60zt6*lcBfb{BT9mlBfnR&GqUt>irg8W6MI6+xaSFxAWJCzMSo%Qtki zHpe6yi}t!krYMqBN1Zb#fa2^Vm4RVhVorLY@5gCo18boT$|TGz8*d;!9SG_4{^|~3 zy`x%Bk$lo$?mcO*F#{I4$48?it?}mP|S;Nytd|hE=&O3_(en;{JA}D z>uzG}RhDc;gX0hA)M|tVS&w6i^1)~gJ(|>~=5OeHTdXKeEalq_pDgNHy%S+~Q5L1` z^~I1ftzJj78F?eG6SgUQ=N^^0(`+#Fxg*{mB*d>^A|@( zoJD>NkzwVq0bR)j(WCCL?M;R%0;Jz~{ZaHNu5Fj*FW`U$RcAZD#=r7vmF=Cw0Zc%J zoZv!s8JxaLe0mszg;iW^B;lDg)bfgIaY7+MROq~>s2(zx#j2y-a(?}uRBY#ZnV!ia$%K)-;x+40 z$Oe@1!BHk2Rha`pyDvXrfH5X0MmncxfMoSOuRbn5QNuu;(*mrWM@Kx*` zw{=stL_Ov8i|I)Kp{wQ1{E%oeE}>rtJbW!85(Bjl?BZqYyQDxtYjk~umH5056Bvyr z@du(&MfGon-<4Kwk!N1mgLSPCjyS#5?zchjqFp!B*k(*o z{Z#Lr{~FB|6awb4yTtarrCbIf=IgCuUP3$Vy zBeBq^H7J}a+e69FvBp+&MGE45RaWRM__9liOha_wFy|n)1{MjvhT+m8dlZZrW>qEQI&Gl zf0aMi16y4iWB4npm3-R>>K27Tk2q+}b?$ev?3?T1&wFSKtSqgicYXgMvjT-XT_BfJ z>#4axMdrCP16**RFeN$v-`hKSkc#YxNM>%daF6W$C)`@m-@LaS+0ULO-1LXZuU!rqB(-H0E$i8-*ttKV?J(9s#WsG z7;+0&zxOV9{O_OcRVhrc)IYJyjQvvZ>)c$RZ+<=e^$knx{Y?;UKyScG#pWslKI~c<~ce0K`wh)LNFP!fT1-ql&x75~qPb zZ7FWYq?q68=zYJ<_;2$fHCMhdF{K9Mg-Q?ZbA>(p)ncFYPl4ruaes{6}Xr2#y%+IAFfqeU2X;9*>waH6+W(CRH zbWUjp&%T^fYP!o#kgR*NAfwj9Fu%<)7XQ57?EA8sX<IM;9%EL*E0=)x5H1@-%W-@6$+N1MH!&duKGri*V00eg75L2 zuz-yqLD>~ysu7nnjp9S8L0H$p_pUXNh^LqJyLb_I&`ugbil>mO_VL`d-?nw)Mf~KB zQRC4oKZukMIqA-Rf5$;Rvvv1&2~P$}^j>r4c}Bq2@-7&U33k3p5)p-}Gb!u&xojB_ zT;Sj_VqfuM$x%UOn^YZl`#OCCAECkniTXD~!}bcdl6CdN4!f^D=cny`tx+=$FVNW8 zKL(hUw6&7@jDUqjO&cW^)(Otis~AkzwT{ZV)m#Vr`2qGJL*3s@*><{ifqC}|ZTp8L z?O(65{_%HWQ<=Le5zGH~^}s5h{R>9h^4?Q_`M|eDiwGaO`3t0=lNnXqDS46TpTc?c zz|Q9Lfe*HeJQN8t0wi|a*Y(IVF5a-3Djuq-vS7ulP$|mJUTFvCy{WpVt!>esIcJ>q zLrs3+axP-vI){lD-!_LlQP2WcM-t22hi$f+1rW;3x@T?zJimpw*@=mH`Qyn}2{inn zwfRwwH?+lHvpw8(E30>=7Oe!VMYBT1v)y(pr%tR=-GV}-E-#{VDLRaFK0+*AL{x#s zhA#CfqrOvAxT)7iC;M%`FnO1{8-`j7YL`)qSW`++4`05l)d*e}R4WL_927pHe8{pu z_D6*W@@cNAJm#al{kFE{{b%4u2x{G)1`NYFc{g7(#G?&s9b>2BAn-$sGdtiqf}J(b zWlfk7fN&BO2y&GuS|m8V zz>n+0$G}tD5xq$gGx62L$+wz6*?s2z(KmM=nHrq1i)^%&%c}8raX#Pp>d+hY(7`0y zY=CYa_yi_kTDgEvY~E|DJumJ;X`OVjV|@o-HZ&M)Ahy*&+SFg+1Bh3B3}s}kS2eOg z_yd80GSCw(oAsZm;?YJUTE z;t4YTqn3<==1|sKCI$5gO7U+5YZyi+{k%SUyl%ewF6S3OAF+wr7kC#xIQuE_inc8g zo7sqM`>c3fGY$}ybC)^1ULRYQo6E!GXAk{TdGI5B87Z`f_{~{LLlkx5e422%pnb@# zVJ%RJ(p-!#IbB_#1$q%3NALeYcjIMezS40mvZ%_BZgiIgKSJ?w+32n&I0gk=1a}+o zT#4;uxGiY(u)-jg?TO{wF9J+3zQ9L_tys`Do^jcVAoQg%xyxc6V?CypOZT3b9HSoO z8FR5(&6<;<+U@Rjiz62jhSaCHYh28Z)Ej?!8zF(32GIHB<0=QV&+UA;xp|Lt$e!5ysnf;d{n|o%9xzp&|9siRD zt z0VF58k?>lwRhEm02j73wRWP7butu{E>q(oIGgc}(Be4lv_ERg(iD=c`Zq}RsnucG2 zwU;c6zPvee2y!t5=aj8K%6(@GjXLJgSX=pCWG=Ug4va$zD>p#bEk=OhRM2y0hwYYG zp||zOa5`@J#1je8&2nP%y^ntaGyCt;|3E(9;NnZ@ zzq~C8oI`8!DP{F3ZpF(2RJ+uPfX9Ok{-xcUUnqMYKM!%gXW~`;yiXPN$N=}I5bCom z#?i+cFVhI-R65}xKzG63h>-Y&(5!TqqPD+MfzyQ5ZOv-aRf~JWHHPT3yFvgmg?}s!x`jlVdxRSNBrqQqPs| zZhBnzR2jyuE~f9qbi^cBt^1X>TK0>5A2@N7~(`s9e8)>w`+(^%Bem#As>VeTp&m9kb^ zK;com1Rf5vYUUdzt9X2cbO}!jKU`<82~6oq-jC0_G%jUiKK*wkyv$2F*xS;de!*m=`VglWz)zg?Tv3G9VZgu9=Nm@ zqHY@IzphE!fJi><5WbqZa=XU*&-^VBDv5e-rD}`2|@P< zt^M+dd*2lAPbVS-WyK|iuCfTqv8}VkGoH<=Xl7rgdz&*+`ud48C4pWuvEMIL&*Jgs&hEj3mjr36Ac^g-iD~Zp>*X?n( zsx$WvJW@k64k@)nJwk{8XnN3g%PPN3el|&x0`b0Uld3-bw0CghV5B_AgoUS}M1@0T z+b}Fyk4a`T{pEaRoLKg%*;goMiq11W4#$-@?0}T^Ymu7+>;*V-VB&YJS2;F zkdpvpE|woUT}H^~2fl54fg@G$MM9m}maQJ%b}0(=p&Q490!z0xJo6pWmc>!}66su4 zXCBgV<>Xz*!ZX>z4xhq?w&R{|g-u$MYQ;#bKW1o^(-lud{fMOl^)K6B1>dO45z=~U zQg%OFUM28iM;P6-;F+fZSsTcNr-&nJU%PZUD#QUKZs2k{#bxlzTM{~oR)NQQ1vx14 zeQP-=MqQ1|ksO$~1Wlb3fzdfRER$dD3jsgqeZAVQGe``9i)KIO^FlZ|i1lI|K66io z!jV2MP*wY+2+^&tb#wG<(PBW!xF00OT*RE6UYpVB1_f@xit#;lzUMffrk}Gy+C1S>E0_?S+j9W1PLfe42HAvfnjdAe{G9rGM8j zZ(g}UM`P)}`#}mARo$g84TcK&ZHVn=7bc`Rshlkn(^QW1x6rZ&@VWXeJAq$FdEyjF zoOe}WN2BC4)bXh`i*+B6#d9KheJ}#>3(~jds=$O5GlI+)$j5O1fll}K32&SL0wFMU zSkxzp9}uozE)jVBHMVG4eQlqIz5ms{_Ki11$KsXR)^V6MGan|hyw1?3>ZH?)Bo0O& z_ppa2jQkFK_a7);&w82G;T*D8kGFRev&U3D9^>PQsRvH+*&`X`x*>}4iDr0l_&kKC z^G2#|<|ZG}Nta;h-(`23D`eA3lp%^UYu{w?;`Y{mpjO*MdTdPB%kb$9q6ngld~G?$ zleU0yT&9DC>bT-l-qlZ-pC`h{E{)f{Qq0R>=cw=;){k=S1#wD3mHEZ z?WzXep4-X8e3*bf?+(=b!BJl|*qvEC7TDi7`D?@QiEO*{UJM=}Y&szse59}m->&AR ze@?<@+MWmuT@`SuSiA%tZO+kPE@#Y}B|;q9{MmmXlSbXC0#WlIAJk~W*`f7KZGw^i zS4nd{1pwV2;%qN4PCNUB6Ph$PwBU>!*uT^}(sXUuUlhTeKVa&Z?>UJhqOB#lTfYoM`@%bKM)mo{GIN9KlvPveW3{ zjg?7t5qUX)ud9yJCura^x5`VT_==+dW2QIw`VH4I9Oa<1i*mpryYj}JevgL4qWj8m z7imq}bz$a6Q-8+S_~$R=*7nY}fa>--wO$T4#SpSqtkfRn&1>`4dkQn&*L__zUXjB0 z&|Fw#pc7=Qzx=Hzr-Iuy(^kHOrI9l4ciP%0UNQy$@IBrRok8SO{C;1&f;Idc=FdWh05rm z=YO4$$m&-r=S&yW^|)%)W*j&yNl?PbxnF3r!DL{)F0vm8QU=Ed7^cNQc$8c}1CG($ zJ5eOdL(yvrhjZvA?q7Z~yRI%;b3F%$%6|s9k92ciOzsR6OGUV(X*g(ZsK4Z0mOKYr zrGz0$i7%!xydf>T_oe$ZyMS`RC3g?UxMAdWu)s}~DL4s&n$47!nGt%u69cfH(&Hkm zF%%IG!1NcdJ{u=!1^=DvNxtO_VUK@koOUor+h6q1;9C_^OOaT*yNXwYJp7#d)^2~G z*=!DQ&ciV&wIu!7o1OD&`fyj6 z53b}4;tc-FU*S*U9TsVVXSR`m>AG3tEkIbw37z&ipS81;UK#=?{h7+jReAl!A3~2A;UE zkR(rq&5DA6nK2-a3vAW4o1t}U?wWna=7M7hR;({hOac>nB&)%V+S8g)C;qXR`!n|X zDhFnoH-yCr8vSJ}EfLyy7tiLQck`m*WJIicir?Q)Tk$`T+-T5dvXwr9Adjy*5@FM= zyspY~9p6deTi!$m^8bgXXAi86QC*F1gyD*jCAf?yZJ$i)c(*ViB8777TSg$F2nM@~r z&3G9)r5BkX$5TL5oXV}5`C%XPNGP1`b`iiz{YWhRHc6tutEdjdteE}=Ch%Q~r`@;V z63d61i?iwPFpKEAcr}!2b$plTGCOT9mZ~eTlt+!B=Q$;)K6!}!G8|;6NRYNt<5x@R9NFNZXHzXP#JhnVYcZ2-KAEn>8rN zVU^DHP{_Ms$2m6NWGi*Ymgj?>s&4kequL)xnG=S$Po!>dAZwB*Ds^H4c^uuwa!MF4 zqW|ze0gBM6!4Ip=M5lO7SBKcCkM2-v&*cUVN=R+yqYDr1yWj$m6LCgd*IBQOTb4G+ zknE9IScp3Bz+OyJjd-$da$I;xnqG>zw3V}f8p_7e$VOWoG;674uuCq{1$frjN5H&_ zYyXwn@r-UUI_&zN-)Z*r{jwOdM;uNMY_E56(h|bm|51=9cK{!4BeO$$N54o|{g8nq z!V9z)7S}IiWW|t#z%(G4v_etTp4~=2%%j)51hRF+GuFPI3FmC2`19Mof*3q3^B<_~ zuK^JF&8c)ub33fh%jd}`bj@d#3S}`BITn^p#UOX|kNR2bC^?B`as8wMd2oF{TgVPf zkT3<-R}daHf;^xY*!{i@WOJ7`(H+~kKUL%dg`tbmE&Gzp*~Jkc2)KuKj83_^iFBz= zdRhR!CP$e^)s3rX3rK%$OS&wdhR{%2wT@_u&*}Y25QouXAGnftkK3G*ts;qm>2PX) zo=pEhy53cybLFu=x!lCgm)Qizb6NvWD7FwryZ+MObLJ!aHFKg-fbdKNfg6J-Nv*4GYG_YnWMm>SO_XRt5->USlVTj$Lmz z&Hc>%fY;0?4#bS%(mx2zwWiy9B6mz9)UOGVTaf!SoN2owy&IO`)bW{fUL5mxx)JHV zmH1Zrgzy;1^c`JNZlDf**g>AtC#!!?V`_%FEWDU1iQ=i)r9pEC=Z~~u=8XhLKQOPc zV&3a2>c0YIUDDl;<7}qE^MQJ*%#O1$-EmRITyR61f$V3OldhXoWlX`SATR9vBy7HE>SEr1|qP6N^P3b3ke=&uI8rsj`3>LWS( z9}CGpDYS^A4NaN9Fn$9cawWU!L1>2N5jfgBxniOJV)XfdJCHu zH9$54rZ^-6%mr0qpeC~Xf^9u5gg*BQ=NS>-jS_D-YAu+1+kr)O@IHU z!&Y}U{S926hP>fCV;}SL{E~f1bbG&ry8sDkJWV=_wSd4nBudep$MGX(0NH54o*Y zl^|_*0#*OG*)FFuY+_$u`)W9FGyTqN-nn<*lknI;gP;UD>jLq9?U&Q~G*p$S#`EIk zW}p1`a(?H9chw5qDPeJ(wKsXCs*3I|LuKRB*zNZfRh3;u;kR>Yxz7p{f;#8|u|9k8;Y;Cy}SrI~=P z@|nt+kvu_SDJn%p7 zRoHUs;1nY?L942)to;Riz+#wp(=MaXKxCGBQ+P9d^kC0io}37z_IM*%Qj@$YEkxI%n-J33BoNJY%0S92d6vqq*^Gsy2LGa#2nw% zsrB9V9$}{9T~mv9VNu~Xadf@KWG=Q`Cp~Y|&Lo9@6T0`OgQ_tT#R@9-xUI|N-2hHM zG7F~Mez(P<`_?b7zY{TmL?xU*Sh70#4-fNx3}Sx1zASA8TA}-z;6-@B@E<6(G+}9~ zFOLlP>!%FL4F7?shWldRhDjl74tTk5WQ@udwU5`1qJ3v0{mBCf@JjfSHZB(r=_+)O zAuFt($VukHyXsA!0NBYQ3|H}`mPVtu&dg<|3!iNyQq2AO)|kXF&@6W0z9xNOB|I6} zdeQd1BtkbfdzLWhkJeq;UE(iZ3`5EwWIg{H{ndJ}1F6L>WkYarFFkPgKV74`OgYpw zgQ?*@O$`EJ@AR}xcM8?|f}dt<##*)=!CQfQR!vZ!zWqJzxQIq;j{JP!Vy>G91s4$! zOQhG5#F5IN-RQ8*F=pmY2yX++8YUXrRZ6(WIH%o$tQbFr?6THY?TNy@r%KJqNR3pR z*0)ABt(o$lVm34)*a8C_NeuM3-PoZDqJc4stH*W@@HN{U0v-v?O&zih1IZQV#%E>4 z1IM39;v7~}%*R09QaBQ2CA>t2W9U3QzvG8Gcdh|rKcfoDhVbb)WWTBZD-J~nQhTsE zRWl~MF@0_%h27_gi`Tw3rc^|M>E>9Glb5qmh~n`$TmoB*ikH(VO1xva#qO<5dXzyI zE2nexBawc^CVsU8dS*67xW%*r4FV2i2nXQT*k@fXht3s4z8C!mazT3#PKf;LiFmaZ z)x)Y5#el`ai8<`~4+K3vL7Y}jF_3I6zB~CspVZmgR(c4uT-s+ToWq3N+M$Q+qnSZd zwm6z(#E=c>bffJKU@Xt_4)_+U981X!bbA`YQF1SSQ(51!zN@Te&w`q}kFeR8GX%I^ z9dsC0?L1PO{R+*-a{x?A3(vvFpj!5kPIyH*#R`i%?by#w%zcVNVy`uwt+~Ve!*rOb zMSla5g#&iIy~rWyjQ!cXblMcHkU=+F2(Z9Oq} z5ha-XMo6)vl>3d^GF25Wx!{86ovL`!Paf&nQ?5Xqd-vr8dn~<#&qMrwpwDt$U;VT% zFOV>3%*i&hSjD<7l6fx{c@mDAZKF=u*SGO1bCLu3HzKUdH19d-ML-v2Lw5P3g!fO+ zOHCHTKm30O2545J_KM+4;(~ZON)n_55<6kpdwiWrAl_^`4ml^^44!{Y6qLWc%Tx)>HnKz8 z9>!|avrs-uRu#u9a&duyaH9V}Gkd2cc&f8>l64QkfM|ie%tSZu`!?i|v!{{|BlB3K0~%B=KDn1MayLLZF4ab?c?RT;9HhNHI)1 z`;0~7&Sv21wmP(VrVVt?LyI{0tVfIe(8 z{IgEbK;&8ctMVlI3E=uN;W(w|Nzh%SdNlB#^ELOnbI$pM7A~P#nNHOGZ4NEUAbnC- zcSTL_Re|wu`NsdhNRpzgwGX=g?I%zf`#kFU)`2V(a-wrzSqJP1`JoNT=kccxRB?fU zhQDHIW`Iq{(a8B#qPZJdwR+3({JOU9wNed&ik3mjR1p!Fd+4|vh*0rNM#hC>27a1y z();lcl-pk=s=J{jProuuZCSgVvcbpA@~)QUGm4DKFO9$Thk?#_@(sCFv_5_@yo&u) zH+IN$mhfOVX8?C@rlb0si+=giFaQE|cI}9zA47=D(QbwYuG#E-$+?iSmzF1`Xz+C* zp3s4#0xdAS_|x(f=$|NgVmFC_48LFT?4e7tyo}d~$Jhr;Kv|uf9>M=C{6m~C^P$R_ R5xvvKEs-Aid(i(D{s$ZpS>6Bu literal 0 HcmV?d00001 diff --git a/specs/kbd/compaq_easy_access.jpg b/specs/kbd/compaq_easy_access.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cf6fb374f1c847754742086d33e3186f888e642d GIT binary patch literal 19073 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 literal 0 HcmV?d00001 diff --git a/specs/kbd/compaq_unkn.jpg b/specs/kbd/compaq_unkn.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ea8e07485dfaae1e9b65871d0300329117cd066a GIT binary patch literal 40939 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

    {TD5`Yp%!6$+k%hMtdArBFCb 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 literal 0 HcmV?d00001 diff --git a/specs/kbd/imb5576-2.jpg b/specs/kbd/imb5576-2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9e50ef4ea4d893b45981013424ef9b4ad177e193 GIT binary patch literal 12375 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

    wLAV3b%MVd$ccmMy6kTI#3kjLVi$q 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 literal 0 HcmV?d00001 diff --git a/specs/kbd/lk411-left.jpg b/specs/kbd/lk411-left.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4289e69d72ff212ca4c55d4f86b24747651f0c00 GIT binary patch literal 80003 zcmbTdbyOQ)6fPPF5ZnsIf)prPC|-gEDPG))Q>0jNiaSLL!J$HN3ob2g#e)Dzmu1@wRbb z5#$%*W?|8J|K^>ew?B(C3q;@6#{O@^G#t!^i;s(o zgM&*50^#8k6A}{>5fTxRkW!M9kW!Em5s^P8r+7p~O-)TqMnn6Uik6a!n(Dt!uz;A~ z;NTMA;u27i5Rp**e{K(501ABU9&B?U7ApXo0t-li_0R`k##jIs>wh-D|87{=m@(pk z@CgWsFefyS1F*4xKx`b~f1}2n9gH~+z@fmUd?F}^_ekdrh}DBiC_E(}pH055n_Bnx zA-k}(X9NM^V;WjI`llS6T--b&qGB(^ArcBN6_u1#RMqtK4GfK58=KhJ+P$@RaCGwW ze(&S!=N}OHAu2j1_G4UXT6)H(&tJY~78Dj0m%vNQ%D?}pZ)j|4ZfWi5?du;v3=R!X zPEG%rnVp+oSX)PKZ2m)SZSNc%pPZhZUtC^Y|Az|;0Q_IDFrWVm*#83;1qK&34h|3p z^dBxPY+uY9NP&ajyf&+_80C(*s#_XiI`S> zOYT|~pXO)RP0ziyFS#aLe3b>p;rNg1ZlADe6&iPnbHPujr&z7*JHREWrTbEgh#ygO zjN88pti*ozvs~#ai zxm3I7xaYTOGpC)=NK>C8thS7&fgRl0fQ^cCzd&n%Bso-DIH6H8k`Z1zJdDj|aoUnd zNI~y;g3$XfDVdg%toa5P@Pg{S91;No_M!M__M8TmbPt$5=zs(sr%j5S%!nBqdQ}{( zIx4O<&rS%lr#mfX_7!QGC}vdjrpq!EM5K0(Al@H>-vW-x75r zoZPMBhsKtxWPW9X3-tdyp06{?s&cc(^4lt!ozw#Y4ePgu z3oc&q7;X62Z>=2ax$gPy>dKfmVf!I-&aQqu00=JP(WFLw^wr8Z@$>rdR)s168RN&oE>=RUxuge zB29au31~$!N=y`zM7VRC$A6KnEbfAUnD1K+#x}3MV{uX)icwszXT;U&^xTBY+x&AN zev_Su&bywX5TH%`0*|>Gd(FhP;OmtYsHYM0;tds;AA-#ELrR6<6-hP%@BuJz97VuU zmTqU^KU+_(zs=8w1Ev!ni%(RLt8VE1*d!0_7^3PS5*MdsEN%7@;TRH3^(0d>h93{DjyGf7pP3;)asOwmkGHS9t%$`2+Pc)D;5A=eEsqOvg^7+8|ai;|J;h`}olRbr02?%zx1rhG)JrE-~xGk8i|>o@A|dHy7IRk-w-V4~Bn z#@|w)FfX!72OH(wN`4-EG4t(fdqo+wrytOt?NoHj<2aJKpjP#-PM4MK)HEr#gblP< zEzh2=!s*{Doyab!o8K_7?fZOx_Ni$gVpDdez&_K@>KCY(b44orvH->cqWr_2-+Wo&pC0hskPfq=Bh_*!DyjZhw4pvUiyGUO9?4c5|e z>0n25*ei+%3Ef(v@Le_Kk*rl9OmCW-Q)=RA^BCdDrFD9kGDnW`uwM~T+ED-FJuyOm zWM=dOKr>SB`=|Nw&Lhk?gS$q+nyj<{#Sa`~^+G=;&B( zO+(d>7H*=KMFY}U`#g~$12olMoF9FkmqvM6>O5)AcmXndG)v888X>=_dbZf_9T*U= zo}5n<#F-UDbIDv1#M_j!4#~ODOV4;gnTNxfN4+!XbF36x{!u-)S1^Oxs0KV$m})$c zk@1>rKW@NPFKE(^qssa^Sx%-t42+fzcEXJ?>^f2I1gUw=FDbGZHj|`eg(vcmR~r*W zcXgv89Ot`MiF5J{v{?Nf0GmyW<@ycD)obnwk0z7%)prq87cRfB7+VcIoY@4i-(Jwc zgHvUx7(Rk*B6TYVB>qh@-1zgs6F8y`c!qfP4fUoeEaWOehI4SIpKrF9a`TzUn^lrU z(V@aK&t|`SJOG|kT6tfUIvBIDk8=)-OST!7yV93{;+pm%SKs!!cCsIP@%!Iu1Tgoy zePE)$bVh~REa30knpb&n^7l?;Zn^yOWhpRgRMu&&y!$wW^9m*13!chw95Sx6tb4Dj z*TgI!-VJX}w^AvuRc03|Z?9s_Jvf%T{?p~Trfy4SGBRE9+6wE(Ab?Qbvlk>@26NB? zqhN#y){=j{Tmatvypi%?7!pz@#zf|%L|6$yc8DwaFN9cHnmBF&@&?REgUeKR1caoy zvC~spuAGdiI0T2J9nDOVYY9>V^utiJ+kZtl=5BMp-1fqBrJQJ#E%+rDoQ3$&?n0^}*RaQ8DO~6tO^TjJtCj1! zyhBdVKeukMQAN2+`Qqi$v7@A0;OX+d*s{pYag-dL1q~c-!q6fS&cI3sVxO#~)s@4^ z();=g_JV2dUpi&!qCWa|>y-_qbXOKJX~Q$8@35@f4(|LWN>AnF@%Vf1p|IvyMaKEzo zXPy@(oF@O~4cNBU`t?zyt|Fm2eOvGnGO<1qWxnXH?BvZw*R`adHZI~H`&jft*f67t z_$cerOB;P#ItvN?9?_5Y?q;OzfBea5plr+mMsz20HyzyaHgvaT%F^6wVR^ruVX+dm zcCLkI#azWo{9|P^m>mEH9gSA4Z$&u@T^N$IU8iK=O6t7y51;I_15$QKq!>w z^il=C-KXaHbm9HTWnOWJetW|S0hn>*_yHhik^Rn#{$f4LQr2}>7Xk3nk}vXxl!Pby z{maS5buQ^6)fVn52L8=dqTPV2{v~+bh;7|u*(C{^nP_~#s;A>tISphHtue^SG|fGH^M|VPqdwlaUXn>bcoXe< z{&J$Eetcx&G%4~>KtM1qAWQ{)=Ol0^qwBcrzl&B)2q1gL0P|8>8}JkP9R={_$o^e7 z&2)+=U0ca&2gqH=Ip9P%YHvJ((HqsVhds(VLaWGfrl=7hm`!{@co_(*E>TMzopW24 zyklGwgo5^R*$o4j7;jhQli>;b@V~!N-D0d-` z@s3xd`ffmJ#}ws%E@N`6IfHV%ai8aK*|EA-y=D>yjbm36PiK-+@wk<7R=wG(m?8rx zf7txvT`Vm!qtsLd&7?<*LoWJN%06#NcvE#KSPSWMKW)bQzF)2JE56M)6`mbgW!{V!wY0SE|``KGvgvnh4%ncx?=!m+rS{d~DIQK5_xZAL%^ z*x=(wiXoW2s~mQjY3x2Gx_PT7hZs}4%btpOlZ>QRZ`;rj_Sa=yRQM6Pcl(llDSt`a z(>9Z&4cK*`bK9tfPn)rmS7KJk(cuBmMv)d!p zv#?16Y?v~*7N`;mef;_bUyroqDAS5G;fPcdMs^j6)c2NV(<$h!gM` zI?W=rnA>f-1`l+S4PS+l23Qvx0(l1{P*nKBSx1c-WGuYY_w}*rP)!o?prSRe%ZV@p zowR1xe>r&(@+eS)pbAeP%(^H-H%y`t>@7Yj8MlCa48Q&zfiJD7_Uk*jN-xEU$Lvaq z(!`Rx18LZtcvrz=o?jmINfznod|HGbJ?Y-E2^` zDBgsMM_B+*ne zI{(Pz=u|_v11Ns ztv(t=wJN0P6tP-LFm4&(VU|e3bJPS(JY5%@jhvgpqQZ5kLC*Hax4%i)%^z_bI+oxj{7*e$f1QO^}%DckZS z$zhMjt$F10s;3;E9T6Z#Zrb%tNmfzn3j?RNQ+& zNZL^imW`lV4YLPTN#mT7+ZjP_xozXe!wYuXnLkC~;W@DU2x<@JvVQs4LjN$fNS=wB zs7+iPtUvw^DPy(=vT#yhW{(hFn(7f4nDjrbJmZxwfBn(p-{7QI7QItn$WpNa4;O;9 z>Y42eoO@~>*s-Tpm9!kC%Q(-X$AFh^#iRSbj2cF^46!)jdyc=m$B(R|1#c-3CbA*# zavU7OSSYom6CgV7evk{1C|kA2&OKxU>ti!&@o^J2%XAn;&O97{*7p^enrU3W^RE3T zecN7KaD-#Y@}J+SRJ!dEWL4(+JOZjLQ^vQoe&cLF5#v*Ckyveu0R=#$l#P^L2trWd z3lf5J=ydSOjGNh8F9L?7Jri;2eYvk4{kWlt4Ju$I%UEIjx^b+K#Wry2CBB?4=!ag< z=4TKslBwRZ`HKMLDlzbp77sQGa$ZI(r$;g>{B~&-oRdD2U;BraDP|@MPdFv*cKb+) zju{A=n#rO8xw}eOO-#JDPJZFhj}tU+K_bP44AZLSmJgZ-+fOER$#-b!y>x6zQ~^Pl z&R7<+Y-CO+zHE?vImwg^Dz^6w@4wa9cOaJ`H zlRMU_=8L`yY9_lDB;I{dMk#7Gk8 zzJsflZ=j?d0~SCl?%{fn4nP<^RJ6-n0jS8#^oWh5HR&xCg4NBAe!erJ*B}415TzyF zr^kc8Tq$oF8ocx;YLj-?Q2Am*V{>n)G%Xu<)h-`q~xy!zm zNI+p!=WqV^bVwRXkrZCM`7p>{DBhIh9ELMIfb0Na&%qT8A2ZDUA;2aFn_9b2r82dJQ=n4w@NaxHw+2MOARLZFBpB5YJlq# z+8sYQPXMv*hvl}+WUKceakT6QqG@lD(l$huIG0qWzV2UNcKy2RSOXPAO%)cIMmwQ@ zFJ}pNulN`NZJvmYfviPO1-$mn=<*yYWUh35w>7Ox(# zRM=Go{PGGPC8Hedy4cq2CP|t4DRNk@3P#JEo-43WCn$ zU+K=L=O)!+TPf;Vj-1S*Xk?aC0G}b7sm|Wi#xR6I0~exnEAb?B-wm?o1aqS#(DRX8G$9?w9(mr`=-Gs~M6&dD4-w|7&83C%Xy1!>Ir;CHlWDT?dq@-}EpT!fXF zFt!}EbQ?{q;Ls{PKMi{qAz(~0?yHPL>=4~HTF1r-7705^(|V-zniwU`Ewd`cqCb-Q z+80;_9o7~gvvf@l?@fk>1((a_0aMZvA^Cz!KFc)`FR%s#uP24D!lwiEe-C!2CoGZT z(-l39+<@6HB=o)%#KI(rXH;Rzvk zDNiPI>)Kq^w%<8wqqmeTda_KEtjCX2(6Gs7bJ5Z`BE}-pfVbJ3=~t>ciIG(-Sh=6C zkMtDX+C1>l`-LL=go9V*gvTDQYX> zYXixocp0d9j~3;QEEDP5expB5ofSt90G8{%K<3aG{WM39-6434`6VgjjKv5QAEbFy z)XTT7q1uIvkKlQHgn)5gCAO78wo}~yBJ~g72hAKsq z*=0@IwaoJL`_^~TG+wdu%xGrq0WeVTS$DPs+TPg_6fnFLnjjicHlt$sI_c&3B%7}* z`P+YF@T~Tb`uMVWWehdov+@A=sdZE{Dkc$WTi=9pEu7=TjckDd*#?0g5d&3LMV)^! zo#K3sJ%+xDZi2IBFGQ6-0Gd7^PT(Y=Y9ybg_tHaWe}&!}gxFT)r)``N`4R?V7KC#& z)ztk(u;$e$@Wi2~>G?Ltbs-P+lkHq$A@U5E0$ z=v8ee-Sn%#`(6&{vWeee@x|vfryX^dZlE+z2o-4FGtj78_%=?C)ZrvKgT<6V zl3SzV1EAl){xWTiOXls-<1ar=2Oj{J<+oc&J*^+AlImK|iF+gC0xlKw-geifKid0= zRDEM)k{feNA#rlAcPe#jd}!-WvhE^q$DjNFFsb1jNCNitK|h{ikh@^OnB3l4;_fKc zKFi8=$Atuul?ia}>Ea^H3*(BTlWuQ$7sju&esWyyuF|S3uLm+;5|@Wo8A0ox_cqwH z_025Cz%dNp;fGMN1|>RYJ^Gs(lf;W|ljyIY1=mX38*vanl~qXn3_XL_y?lnrNAm&1 zvfGV%kVN?RAXO%^3+uP{21NINpd{AJ$IQO$XQmLX)0zmr`m^@zH_?>GO<1zjQ*wuG zy2%kPbGfn*<|@b=N5uL!OAm?~UFYS5@gEH5-!C0g3r(7#>U5z!1<;1Sy{}as03SOR zkFrQ)Os)vYKA2Q4X4~L{*d?rsLq9AerTcs^0s;2WI(rVGSvkw4L zu?N7Qg7$c0_EU_}Nm35cN-}>+b3Ls8A}u-O4hwabZ?;ahJmOlIyKm+(Ts1%{j6}Jv zcV+1SGXtLdrEs3RPWk!n0T5G{6+Jz85HCFb&k1;W>e>j5vxw|1!$8emh{uAA_`kv(bl#$fwI4(;`r{ll!qWsD)`MQN)8l_@Rq-@*nB<%t5lG!%&M=Q8_D zZsEVRZoK@=Nokb-ye2zPDuiC18M-Yt$?0|nNtcRACP!j+1XVb%Ra~8wOi^Ow64t3tb+ecmZN%Qs5;8Urm>JghMN{zpo6tL7%KWa77< zyjJiO^4j3-U1!aU$MM~DX82SO=)}bxH*8OQ73|o2e0HDwwx(Rf4$-OMBobr`g`MG^;MDqY36cT+GlMJ?b z5)I8z$pwa?#)HzrBd1PFiX+iisaxxAKi7RoZhS6Nv?VU}GzhZWmm$z=l9!>b2h_Da zm!=wsJ0Hv)qqeEHs{QrbBNd?lJj7`Q=sd__HPuqcym@&RzTel8wW^#FL} ze!t8lpluu^TI?B$s*Fw!S?&}?F){rf2*7iM4z%0%Gd=D&96erSob*RrC^KrkGAi^7 zT-94LR`l?d{A%t?i=aiyWK`xyMd&(f8Qs72FxceRcO_e_K}7xBz%4l2Sl7DeDGFUI zM2z8$61@Z*lCn!Z0R9@_SOP1-FGjgIa~K`~Rl0~nnJ#yOCHv&jejBtv?y%dQ2T|$3 zU9$|kn3$skWs}=71aS{lzQxS;zS#kh4&YJvHKv>Qwn3CrBQCN-k;y>42f&(|{bP`~2S1-dOu+$jBY_R~+}L0ukuJ*w zxi8dq{KV#?g5yW~*DjRJmnLBQmd+Y@>++G#QR8tIA z1N33VUd*5JhNF;Yn|60~GJFf+A|nOrl*dDinUP7QQbx16fO|eN*k3Xij5dD5cMOTx zf5uqB0(?ra=aoCqDSnxDSb6CLN+l>#q@x`lR)W-6V7z&#)&qbF5&y0mG}LiIb+LhU z6;!XEAd$Yb+Q=H0#g1g#xzxUGOKKLmVD@i)QBy?$XHbf0R<6hMjl;gxzKN$bZ;i~ZKiAwup8fVY5;a+11#1DCLyU5L3hY{kordTV82No>v-evm(m@ zyoy-CCU9fgiCekL@@`lTR6B3=-S<@BI}b4#BCP$#E=gFyE2X=vc81a z$smmkgVq#BR{Ta|Og30w|TMP{4<#dgMuk?@ye1({HTAoc;sAlTkmixGCks&Kl8- z{z@57K|@>#3e%}<`b@6kV`XVO3029Z>v?yT1KsDPCFR7f2e)M-OGbps1-Cd(+eem?;Z?Gb~CzuY;u94W| zFLf6t?IF!3%@9#18^iK5cE^7gF#E&Y3D*+z$A7BDindWc%p+;CL)=fTua=0=l~J6LH{+6%;Lkx}EpbZt zvqGY2tkGZsnrJ>&+T(EPg_4^3tm^rB0=+0vTYp;%hHz_wO&0k80JqkMD&gj?qU(Ph zdN+7~WSP`fbsqrMCXaHTD&gAf6)#ac_()YV6B=`K4(W|ETRMI5)16NH5{3wxEn%de z#=V=299Q$3;)}2uGP{}d-V7c#$h&5;%Au(T`}25uOxBoOau6)uOGks~`UB{_&%si3(fmNLe z)IIyJ5mKvMHAI)8FXqmiFF&X96H)B_^0=+o(|9BoF*ZzD(VT&DFR!4R&Z(S%71FCA zGDCZ09$~SG4+zHjO@uLvfZT4PJLD>nvhH!70oG}Q_@1)cmxduj4J{T6%VdJ|^k~4# z(VW~T>p89T;rGQ|(7oBBFX^O_heZ^nTlIk?FK8O=voHpYW@s;g8i-0+FrLI!_ke=p zPVr=g2b8#V*gkOsIe(R^ur*P2WV9wNWM#mk_t0b8j{@Jh5Rtpo{pXG$F_X)I zpJv6kIB3WKV8F3Q`!$!9R-UxOIhV!6nq~Ki6`(u>PR)ABZ#(3z3!Q&A`%WLjE3*!5 z4p$mU9dn)Qs1!rll42AZ8*WBET@*Jvd{87ORaR?TpNG+Zq$ugPB3XBcYTUHL zZg2fQ_uV*5AzCSHnT$I$$u#B0cbq40A%W-fFU`SW0@8wJH2rIgi9d^ftu`H`q$3Mm zkyl1;hci#p1|ADCXIn}I+?K?(9w(9B^X5c3ueN>rutII%u{8brl1Uf-PbVqhRI*JD z8vwGHE8l%=v=6)EE_dp0O+=APQScly%AJj>NRjX7$5(r;v=Jq7EIj_?|Cn~R;swCK zZu<11!8F_#5GnbxZD8rovEtX(D)8K)q)!H3pmry&9d7%CkVo8ZA;loD&tM{9xNC!A zZYmr56qT4EmBL)_D}J&TT9@aqWK>s_G0FY}Fs`;EO7pzPEJ72DSh^xMc{51_N%b-P zn|25puJN+?2yc*laN@RV4&CxDRALW)%U$@{!V9fY1p{YIX4wN$$yoHuqGcBoj}{V| zapS0YhpPGL{#eu5vVjVG7`LmQjIF`q{Pm`ZuOBJA)S_Jq$RuxIbAO#=l8%E^mlj)&^|*@TnihD1MiwE5>4m}KUD8w#DQ3jsO_Ay&7>R+BH5T4j%m=Gh$J%s zDc6lV#rJP44>Spv$$ory7o1wj$v&By`9_O`z+J{WJhO``2FOS>fxggU0ZIV?EgU@t zKz1-w5N6kbj+HeK!A^yD_KT0A!OJ z?kr-Xr|)U`13D~cBIpfNdrhA-24 z>YP_tr(8Ld{ML1gDr}g}qHhw7wk)P@HJ<*B-Iy$CaP|UYYYCv7!C@XL<0e}nN7bGh z{0_IKHa>8%ZO3P1Y2%0JdxHtQtHFaz(>>ie?S8UG=jWy}=2NJ%D&aOi)XMiDd6m}K zEbNg9opRg3F@M#8wPclB=d7c8R;1>uLV>M_i9o~RIq|)u@V8Q z!$ta;2_}M>LoigYXX{0*+cPQEH^s7ihLT@wKaXY)uU24%hmTvD?2>w1w1rR)UB>jJ zIEQddR##W`ozMIpVc>@L&2{fCHd&l~+v_ST^Q$nN!caF_AH6sHQZ^_V_sr14iI?m~ zW=ae=r|Zq5o+O4^R143~&6)zFzgOgk|JH{pG*b#E3Yvd`=mz8lFo+m7Mu-W*keS7m zP2b?MUfFQwv1+LJvi^H9z7nQ9JZ8=4l5>hMbWTa>E=%KA&m!Or90J|X%-S4eL3Stv zwe6vlq^Mk>s~n#`w3(pBJLx`juiqItThUslb3XtAnP<;xn!V2{9UqSsiEVXvp))Ui zSTUdK%9*&YjIl0%Z}@_n)@D!IrEQS_5e3?+&B`c^`@M|y!7+EI=#m4*sJ;}i zO3Dvn7%a@ggjAoL$gXw0d_@jrIviP8W_G76`oiY3E#^pFaE;$PEyvQUSzV<{3w85v zFL2qP+a&r|Y2i5wInxJKJ*yB_5LWp2foD9)fGw%CLT77oeoJ89c)0O`ysPeGguAgm zzY6#y@+vd3H&f(VYjHEXz&XCDzsIB@45PJhoX}tg?6PuCteWqR!pD_M! zn2KDBmagA!d`&~f+;i68__1U&#cw(#A!fk8=%);sky2i>wa5-d-rFv3)Cs(f1v>!Q zpv+?QDu>5MbY=nk7p6+{n+Z$sE-c_%66nEOytdyq;CrhBNFJ!X? zlfBe~2%qH+t;(wGv{=GFG&Ndl}H8uU&h6&PWop2(*4R0Z0@xC;74ZX75U3%j;%q~45l>EdQZZj zgT0PjXmeAB=j5-M`QJ#l&-E(FU6eLd(f>93p~CsBO~uapolx#@ZrL|QD87@u&cvIP zs=|724zW0~!JU9W!wQx+Sx5TM_FRIV!)dMie2%!SL%-fS4gY!yQ-O1J3A|ZiicYI5 z@Lftg;VW4I2&Qvxo5`%SbocuTaf$g_oeDr600<3t|Es`6X)adNtlU1bZ?esVo=W)A z?!nH#ep&}2L5Sy+i#b7y5F-0&&7ZeAHM&RbGH+wN-3b7zxyAmVy%ZtE8x>19p{dpulcPpI7}I^v437{uuupv_?#fs(8X{U%nRF| zvyRU2DFr0X_p>Q(WUof3Y>_&C7w(7IHo6C# zbT@_hB304gFft3=$IX0XiJ`8|uXjV}lf|GD_MrP4wUeLWEiz;bpJ}si9su7nc5<8a zx!xXbc0+zWVnLP|YxqC!x+3(`RUA-Wuw=d%HZoTX5*$*yU(U4*8S92SZ_-NTw4c{_ zs(Vnk`aA95kJz5oP~2s1@JU}s$U%@(aTi`VzZaXW7ZKW$amYl>(xlyPc|NTFv%Bln zzxMr}ZVYF{HrrkiPLJ@;>)(i8PPgz{=n&eAw%RfFnqV&Wyzp7%XHU^{9`w|NIL%8F z7d5nOGLg0hy1bpC;L0veU9*$V>W}QTU+G|P8Xq74VHaw!E-=itCeDa7CkGwB>$W*i z>~=_EqZQdWC@rW|^u8K@6}R5W>Uxi;3&B583xh6K53JQupg5`fZeJ3M#2eDFjZ59* z{V*f|v({~CQ6F2Pg@VSJ>wFgkx~u}@t~-TPz^hhgHR(Sc6_fqeJaSu?Lke2mlP+SB zm8a7;PgQ`x1}UpE+EN5xoF5&dhgsEyq%sz!DyvKi*i}->*6AcGB&h!-hSYx?SnU3j z?p^1f)gjw^E_2&K^dRVJ)}8h_BQFT?spqCUvz`U~&4=aYFtnH6J-mM6y+Q+*QpgUswHQcOaIyah|8j8Nq+q*_2Qi!zSdSYPb0PmZQcB*G7=h zy3!#U9jP|>DGj13Jj;HR7(8mXaCuKha{KY-^v0pFiBRlEP~Np6hKZ9B6TNz796RsE zm0U(Q?zU@e0*^3R5BwG{2iE=ep)HCqxj+$Y54tjC|xqq}lp`^N`-*x4IQDx7c&hsMI7CJ8i(cPu0$V_lbC-P)aWYSh^k zK&h!!WqbKa08^OQ)!k3zp=FSt_#raY@2p&gRqKUD7C4nEN7A6*de~h^c3XQn^68HX z@MF#N{e9b+Ps*Qyr0suP4!wEq8*h&hd~DBas@(8|g2zv4lIml`ppQk22j@!UKM3x) zD+WiocYXoqqRfTn1(FUYAerq@FwR^ zGzF6cZ(#830R@}dRgB~!9V#1RZfcuOk}~%Fdj`lIFm*=4Fe=76SJm9qq8dvSCLfs+ zepYF+Bl63?UB!h#`!DmCnQex>Ev0ip0gnTH`=jjMc}2d4c)CyLys9=SE!v|IatKj) z@R~7aXJ?CX#9cnCc9Az1rpRAwCNGp|2`lLLuL9%!^;Y@SH6L_Iu-KLNpk@>UjTqjf7v`7cbnuCP9Wp z>3oG_$`X+pB%=WZ`a(geyE-J^$nbOgS*#rgaoc zR=_fOp1gxVBG<{JlOX#Lq2SGnVyf>xDp zOtbH{wdg<**W z00C!tU!RqGzHF%ay(zS7#A(tJ{?w6=zjFTz=$i*|T~<&tvcWk>blTNzujqcl^Yc!{ zw|9qSx6eQpo?hmrmr%91ZMeF=s;N|xN95I!Zf}X{;?h@Sl+Bks`BfiAT;39W@1-34 z+rgU8(tLJONiUsN@!!#(a?wV05PIAvaD*O2=Atb8ykKc@-%f2+eFTGyXtImUu`b#h zS(qXTox4Kcs!xH?a&Q{nZ)xnx?8F<7?s)&69W!V&Dl`7JNuZxiY=vN0-m zr*3EXU5iV+AG1;#J61rs%0Y(H)$FQi>EuDU)YTPgiEz8k&nM9-1nrz_6EfPwi`z+t&MOI4n^({p#<(TLYrO-<=#%{2vxh5z~gfOv*CC3+EfQS zCz34uI`}qSQC2Txdix=j%*?ym({`axknU{M#X{;`b(~MKA7_Wxv2ESp5OrPRP0HX` z5Xr(1SAjh&$XOL9ES<9i*WL`9u}u2CY?WtyO0>cliAOGlSV_Dc421?^io`{i1g<1J zmS#zggcIl|BBM{nL0b+~?MagIgsIBl4Wp6J`T#7XxH=oT&AZUQ24^@yKY$486JIp7 zBg*gl;;%H?gu1I)CAx+DAp=QfV^Rdwp%8cECQ}0^kb1mj@|2yZ9vf1;7(K>Kp& zO*LcR_KJf8reBInH5IPtFbf`?fOg%85ga3Uu2m=! z4PiN1GkqVIm`L9GMG=|E3kea37fA1On=311^1rlq=ocIj@)4){w_zhq0{P5_6Jqdg z=$&6vtnK~yWq9GQUI&_Q!e_|qxEpF)qi_bulCUL1kS?E1`SwX8=(9h=M&Np9)8W4= z(z<+OGg$@RJ~E4p-@KkL<2=6mK2H`#n7nb#^3o(5%CGfjCmh&jctT15wz{6yEfEJE zmGxo^XDR~{@uf>!DNQoeHW}Eq^$$Kv1S7EPzsl+oP%GW$*M1QsG|iLVF*Ty9^bpEM zF{LAD>AG2bF3L7xkzM^p{wlP*S-$yy^RttvFRR}DwovB6sq}jG!JhU30I7j@;xB!@ zC3uT9q{w?k$%}G}7hv}=8>yGLdJ}ta??=672?#Q<$8f*5pO~BwJau+BhjQ#kS2I;N z<;bGyVw)KPHa2LnkgR;F#H8qwY-lBOl*qEu$VH4Oc<>MZXWS>BX}fk+jw0Yds`&Th zgF+!xCHs`_>~!#7jXXoiv4<)Hg4z=6a?>YR zFr^HSFgZmu zdNkl-?~gyKzpTG`Ee?7w?mW^d*fW|h6^5c{1_T0}omX>V1&5;x?Srq3$Oj0R+LTSo z)P5_~XD`0G4p^&uLbtpq@|&X@!PZjkcK@h@BM7?42Bf1C$vynG4JzJv7o0$<-n^eW zy^^BN)DbwX+4ikQZGcH^Qf_^OL!05SA0zL4 z7*Qq;onqVY5oPe}RkH%L7+vfAd&S@ORYp?2!ftLgcc$fO+CLmCusbg%>X$J!JmYwB z{1SiYAQSaf?5Ae-D5njLa~93OT<6qkU@=i@?^{q%q?u8->FC1acwYOBb~{khb$1fV zBK`>C>t}+L^xX#lPem~$-30&q+J&)+1*6ZEfYKp$(8&h33qJmhNy7@SgDu;?IPW}# zgp>NF^LtT~?Wo?Lk1P4TODT86;xLaVP0VE8s!s}mz90`P^(MAFRkL%yBANnZZ(4J* zc`>YQ)aN2z0ilK`ml?$=f4)u87VLd1EYEV2mhdfAyDiEx5(;_h_*&{GV}N!D`?izV z+FzM3`5C{y{>JGu(ny8=-o#`PHITPsitomeBhFt|c-_0Rs7|}ssA0o3sqHrgaBn-l zSJ~#kgsSRPjQM~PS{1Bb#<|aqQOyI4hFZN6ULb!) z*@EBwLC=LRUKF$*?$6HVkBT0!ov|*h6Eod?gtwN^_*toTLDs(l|Kaz-uq9ITM64b3 zX;#6hyfOLnTOywf?6g%d&mF6zd}g^tz#CL)9cT+*;n=z_dubP>Zu&+sRjq`_niV9> zjmvVE1Id>nx8r=%qBql##r!kC(lN-4z43rae)uzRsk)ndLV_HzexdgollyS9<&H&i|& z(|w5*RO{3P0X|hh{86b1jxk&$?b^el-L+)DgqnWqoh1+gKgvpSI=u-^5LBe(ox|hp zwtM%snWZvuXvAF0thsHWt*%Xa^etbnDld~e@957pFZo|DOsSZ@HJ9YV40oTf{z>{? zTSXPyDy_;-Iy*RcQC<_>%@&Ea@Ol6cvhdd}1$Dxt`zxQ%->*^9 zv?LMpzTk?O9``i~+tLb>N#md(TOl_?*|JUZ9ILbmw1#-7MlIDB)p5@)5RV1ZBaQg) zcmkuJ_;7LKY#gFRm6V$e9sf;<_?A!*spk zpCllSoiOIRSM5*Xymacr>xS@;^zSGai-1=uK5CB91LQ1NIxfKnu_9piw2AmSk19<} z0Im;B_w{Z{@yo?r)dqzcgA@IT!U|@on&~1PD8SpSap6@xp$^r5m5X(~+ZK_>su%tz zU!E;HP@Y!H20=3nQtykhczj6KIxZ8OdpYdz3yg=w#^P|1qFC23iSJDL?ncx3KQo2O zDI#P_Q|Y`yF9v-qTs~}079=bUi-?4oS-R9Ig~qu&PswFOq;F~FIF4c^T{qo5M}3C> zd>1_sx4;S9;jV~Rb7~jvP}NalqjW-tJJ(~$%tuIR=WW4r`V6m?-5*r zdYF`^X^CNzXDPMeK~)b<^=7-TB^{QBTD&==$(``OA7ml(KPXxc9I~vZ2r37V^o~C` zGs4pPm7WRBb5GVbGc+^MrNz-0cCZHnD12?)-D{Wy=zj)kv&78Jnp9lP%s3ket)f^` zi6Bf23p;+cbZaO3I7yoO_4fX&rHAdQNP=TXwk94awU`hDEj^Gd>l6Xe`(&+6o6E*U zTBj|fjAlT#BzvH}EkCN>+OZk1yt^SYhk#9V9o6$RPe z$E7fvE`IhmetOF35CwO*H=S!S6{Lv+U3^L;D1EGuS)=9l=s9?u73agRO}3iYc{^5T zv(H$l9}zx;%iHViw>QCvLM#jQKDp;cF}-nZVpaY7zA1N5H9TnboL{!K@@7Qu?{cxi zv~<{K?~B3B3Hfc`g8u+D66@0k-&%jo;olCm5njct9{B`>3BUahVBS+4$sO!zOu7G2 z{&YqY?tDu*-(L-Wt~)ca$&sF14`rHum03Rws^`#4RA5sB-a7wLyMJ5z8G?SEuqK${ z9+-@s%|)J+mw;;q_c{M$V}+8t*wa4Q0Tx4#t-51LQRNF_>(T9cC-*|kX!^l_(&iJ` z{*vLAu=itr??qwWwSKk~U4pN+0?Aw|6HT%{T_aA32ry~ZR3!%ec|)Q#ne*V?F~N5N z|F*<6c~Yrj&A|Rv#8*F8YoqULVx#6{iWMZTJP>1(@G7SMzo>@EeVPeOa4nzZ<}T7A zOkzCPe=ubC&hu!FAaQ+MHpDspYIU`VJp8&Pkj=atp?9sa|D^@|C?xkfufWL{%Jz9M zWc1GeXj25I_h5cXbRTuxNyE-3PmwoWnS$b2{fj?u&XdK>-cZakV(Q!@WxjMm>DFi8 z)gzxj#097=pGEEFR)2>y0pEM_pgxP*ydxgt)pZYUv|2fr>rOO~h@}59OpsvII-7LI zlvc+%#mOV0RpCLgIE|~2*|MH3Q*Tkb{xJ6UPK})$X;#FSca%YCo>IPFl2#y@F3Wq9 zw>JN}zeZOYe~Kz2X*Ztahu2RdLKDH3hI8wt*BoTMUd`N2Ed-Q(9odk1dKI183%OsH z05zO#chd4A=}$CZZkd|Gk0AU%0Q&s>^v-_(f%bX|=y?fqHczT*gn+tzG&4cr^m_Nv zpLu2c{{Ymxix}AX|E@k8x-WVArTc`U{a;}&jQxgHGNB6llXC{98oHty$bv3NGmO5+ zcjySiGD&L@Q(k!f^}Z~@c|$Ap=Eb#A5a7;BEDIAp+ICRPlVD#-WDsZ9Y0KRhj=k0G-y(bc?}j z{~`4o-K)cd7bTVQlx5*A)yvnm3}-FF15EFpW?@P@FemkTt@kA^KPKmeSV_0Wd!kQe zDY|-QKVNyT)+csE9g}IxI_LTwKJAnE=5fv4D?AAEI-h<4Ee_FnHEK0(V4$`WQPWEd8v*rifCeG`C3UIRaZQ#Mfbd`_@-PKx{NP)xWN2WZFNX}83 z_=MqUCx{)jQ28%T{H}mYR)Km>;vGlO>mKm7K5Ge(@w{B_QQ&vYi?fO$X-6Rb(mU}1 zh=-iRGST4%zOPohpZeLU(3)PfQErD$P2Zwdye_3}r){w-pPrF_E z7ucFmM$Ccx3Ycu=GC7>JQma;_+)dxQ4|7lF*-vkkB6~Vj__?|($*Al}fD6GP)2J!< zg1edSeK*6d&cBXFst+#eK_8Je67#fo;A!(4C+_Ev+UIxt3X;Aj;d0XyOWk2Ok6YdA z7h#si(tdt3r~@!72jN#;6@hm&C^`)OP#0Kbc-{-EuS?sR9^zmA?#eB3oyKcue zZ~X{LisaI*X}FV{`oho?qCpr%PI|gbeN_%Vec;PeDufA5jjU}?w$k^%T78jL&+XHq>{95z? zI*H~ulFie8jAraD4n{gW*)c^vI96Moo`u@X?+m?~S>q9v@bh8SayhG~?Y_^u3nHAF zWm5h-R2LLtxX8~x#d2(GGNdfP;pCE(rAxcA_B~!r&&g?fNY7}!?27)_Xp~E30?oMP zWsnm2CFY2GEpzzi=C-=r=BiSCZ7x9)35xZh@>e1ZU(-ePwb`Qc_JZU3`F$al|C`g& zwr|!pHa!F3b_j2jQXfQ$(3?6-nN1PmzjEWE0)#xIhrDYJ|&yst8G z+lYZfbsJyocipHHR-wo-2-Oi;aGch-oaTRkJCz6v+Lhn*Jigy^nj@%h6V~$Pu5BQH z^Vi5S;MA^e>g$_&Sgx|Ti#NwR4eUpm+uMcl+HLIVNjDkp_>(df1I4=LQL<%5BN07c zesFIvMme%mEq#;6@=uoXtmkOF+N@~4Pi$TYT4w(!Z0{%fX(f{-LW%A?Q(ZJ`9K7SB zNR|rTj&T0+dqRTa++}3{mgy?h@z-%FIrs~1>DxQ2zGd3=@L2*Wf@?R>{{gtnW&ryu z1(=4)CC>JkB!ve4xg3?Ju&noc_En-7q@dFNg)8K0LyvyXG7vb1P9z44zQHwfGn>R3 z?Dvd;hC+~l%c_eLY?@%6_I391#k1jGUE*!>r{5R<100*ULL7cNLm(f$&DBa3qbzPT zjHyyXSlzV!)S9*GxmB3oDtPP7)oTrl1=kz;$i1^l%7)DKE0b#l!%Te7O(3IP$;5+^ zj;P8qDiI{Ea&l`Pz_^kcIT%SL{}bUhP*|#s^Um*Ez%F=?*vzEo$L020m0)*%o$Jp| zz*SRGK`9YCtf3!WnV!`BJdh{Vo2%}5Ay4+%iVhPspTmFj*FX)|JCD9IHamcI)=sZ^ zBgo&0q2&!D3hdCQ#b$6*t)wj&0eb_yzem=s9d@q(!*XRmpIcbnT-2bbT0FZA`VZh} zv-5|=cZBwfn40pB`h_X1qk_%WG2ML%mO1(Fw`um>N)c=p7ZwSB_&wGmKsbh1aJdoEuSi>$6_8!>#682*aSG8S__czAx zSG@Z#I4Fs?+2F@paW`gRtZn$D6t4dPoS7Sg%l2O{M*auz$5qZ()q+X6GmjF|MSCH* z%H0{lXr((w8Lx|WLJ3&;4aR-EVEsEW>l67SHQM#KLN&DByuzB*t<^f$mCnk^4lv>E zHwFgoy$0N9lnkYeXQPZ0EM%FOax7}X?bs9R(zs4W8*U=p=7;2qUVOgZHE;Xb=If34 zMVY`xw`$oxZ{CBt3qiu}iC|Zz3XiotjxIh)6=Yn1a4UG;HVTk7C>Sf7s=?xrUht!# z**_OTDKAn1r`)cXy{CX2mFnRI`w7$jZaUHfN~N9MRad@IGa6SaI|&l2{K;-GQ(t(m zy%@?MdL^!$tYA&A(<8Gvp#aa4WhdJ5Js5&jr1--dhahF1HBrxvMz(NW<8m$Ho3^ct zc(#5L!sxy_CITSJw<8jbb7jY^A1}5-!-a-EJC~%zxU)gdm}XK~pic-p1vc@Bq*l($ z_St>(8xjiH8vviqZmr;lmi$+ypR+#`5J>1N(WEsss#f_f`kKBIj^ki~;h;i|L61T% z#`w9`YLG?O8XUgMwF1_?sv!1S4Mr;dpV{COTsF0YfLhMfB5%vM%awrNRZtl}He%4* z=9xt9KPA93KcKEV-wtK-3xlagY7Bc3Z(2I0CZ^_pr7=+8gEkhtxvxoetV;K47+#Z& zuj6m)DyQadpCOpUThTH1%LdAQCdMoABV=&RFhaN?WbK-{AgH{ovGMaUr`LLsB!`o5 zPo1hLTr-`=i5RyVJZ>+p@Fe+OYOv5(LzzXw)@3mTb7#gQc(f1pW!n7Qz;(N*5Jg(Z zB`wOqCh}0X$3Ql;>V9q%enF(d5hEVM6c+oX{(H|#IvCk3@g-3SIjY7`Wy&}I#yE+Z zhetJuc#GC(LiqC_tqU}s?u{xLHIZJKpop;AB99MvdrM77h?uM#uiUoPU|ay^WKJBc zi2OQeE_C80mmr=lH`S1nu3+WJKB)61X+u1lJ(JVeR{Kd=I$kZdzVHs;Y`{MH+V7vM zh9WWuxb*R37F@~+pe}JXyqg4z#;MqvKGt<|oAJfksV>{PhJL>46iN*1H~O+S4xbN% zD1i@W>&w*P;!bQ}*J83qJq`sWT|@#4U&&IG@XH`9QJTb~X9Tx~^`n%GpmMxeyz`#3 z5`qGj2T4jJ3_AiFL4GRCWWEI9J`ju0=&>GLz!#X3Sw-Y0MqC-&g zS}Tn7>M&kxm!n*mhhn-pegkRS`kCzQ=191*0IU>>dn#aE_1$a3RB5kXwyC<`38juQ zD>S+SExP5N+Mr)#;3#$ z4!JST*8+&!!u~w+oWp1+ETGs72!*+c(G;9Z)IH{zC&nIjO7Q97gLV}+j#F@C zANk87VGf3Ipu)MZCb}RxY|672!G*LSNWB^g^WUB?d~o^zm~vKG+(?U-pN#bWA;+ZB zq&{~Yn<74lC+4F*#(@eq{`&oFJa}7kE%JqG8$XaXIUdB#S5O@rjN|Sp%Ezj@-jGvi z7ODYb4AmGI3DEPYP!_+X%~C_khuWr8k5W6LE1K2g1F7QL8_J<6>i9vLe$JrwjKU_l zSnHwKegYr4%~E#AFTgx#+!eFQLVlA3AUi>`Zu4#{Y}3J zY9vL~HCFqLV=P0!wiZ*WE)X1oz$amRLHineS*E$$(rOnR8Iz@RlbA7J&XTA3Q8 zkjeREE?|V4@lZXi;pzAH*IkG9dDXt(?e7llkO&J+zJZN^gyU0G*% z!Q1sbXo?z$_Bdu-srK22sn7x`rS++T<2ZwQZb=T7fb#v{%2NfYdYU2LdbKYLq?cHx zl4OSV91?0od)A#?mI`Zt+69whzA>}AdO+4A*Y+kMH$jXK?q#heBFjiI^8Q-s;tSwy zb4!CxDfYs-Ay;K`hrF7|rXwQNH;RJwY+0Q0Z+Bc<@e$ja>^}3Z(OV~$jEJuyJ`mY> z0P-h1G>v3?ZbING@EJXHa_Tr0B5P;$b@5LSF5|3J{wr7hW6c$eOa*3RU7vnthEV5yMv7bT(Z?1RhcEno zE63ZqF9w2$KE~H*Fv|goV)TUCD~@iANdup0Fe3C7ZsY)GbD?EW{1 zRfmj&+7Za#1(L|X3$T9%Sf?2ZGhzgxXUj+fQ^8;XB?TXT_QZ0X_x)`PhmLI(8l7Z# z;y4W7Tn32Qvfwv~U4)vl^4??KYeh5db#fLQ*e}*><4{M{`$?T_+8B=?>wtgD@885( zi5yNxvPO=EB~Ov^OySVbs^jnpaNqaS=KzPY^W51c9G05^DLPG+%tZ=H)c-0UgNwW=u5vQnG0N6(~`uZihKY`I2DB zmmBwFxECeSZX?pJU>CYs;zDp-;3D~Ke;6v(oh!vyl0|{cDmC*mb(%0vG*TZ$kC6zjzeT2go~xQZ%#AGx+^EaXoGyGK($3`H1(GACFuo zUUGeukmCz)tw#0~+qals?*t-x1~p0cCrVg}1kkwEjjeTl+>6X0qWMllM%5!;q520S7wr z9F*?z9|SpaZ=gH*VknW^GoM@IcAjttX#->pMMqe>GP8bD6QSFRq&9{b*b-uTwnEM; z9KC|89Hx9Y>SRfc(#26TX`v^sI}C*dp-E{EWMux03o2H~Z0Egb+fxAvcwo3$p9C^1 zXHlFe4GH}ErJuzB8sy+-#DU?47NJfz#<2v~?RGJG01=rTuq$A`4apBRnpS?!57%U} zOeO~6vw{VNG38=%6Z>1DBV|@zoQ>iW(Lu`552wzHo`E2rxgK`v=?a>#tg}p55Y`DQ zO!hkz5}|t)Dv}&2^T8zhddmp}6eYAoJ)abVcl>7xKm7773|*OgEM}Qzn5s4^qBoNu z_W>EGR-rwa8Hg#&yh>Q~VoA!3Hy#=HAEf_EHzSY7;0Wy0lu8~z^lYZWmVyRB&qz?b z2%8n@F?pIx9rfzAR><>-JkgHVICx5WKmG=;4*j_O5&vQIxZ7)J1OBYUFm3iansq0l z?X^%gfM&QTowuLm9LZv|z}(nD8LFZy%`rcKp%aX?a*5e`(>x?eGSA#B<6p4Oq@4=H z2TYCtDi?6yq{8H?_D$5HDFTkX!2st1df$!Ew+PaNWW^pYKYuN|Z;y_OTu4L7jiTkc zE*Vys)E|8s4kU;h5_CxhaTFxceC_veQ!*U^tBR;R3mhf_AvJwSdHqTo19^;9rLEXP zz^(`QLl3MF$n!E7P{yiO>oOL>0NU10k^1S#2*$xfc1S3W;d;7F$&|w&5MTL|ni6@) zX@wU9zH9LgdHDw=c^m;U7cU;Ugx?aHGwezW_0>yZ0r787)^ZXzc;P>7kta`z+&0h- z^Q#I$)@oA>C$%y@?Acc@5_M2w1Scp~F;7#eJKfT#uuVG-J2P_Sd)3B^VNXQI(}=AkMI)C(Gvu}i}w)IYc+0azPogl!OfVop%0EPZ#w@$V8+mf4Fs2VyUe08v zA|N?e8J-xvpElPOE^O!KrTpwdG-umJLWTM23T19G8H?3o261t}javM-4OF=4Ap&e2 z2B##UVz7XUfZzF#wWwxkY2x+`8hBXnp+U5L=EiKQVUjE(oF~~nWZ_7dwsCaU5RmO0 z?<>!0l}ZRPC%3~=bU?9A0GXv>k9``7EpvnO^gE)|e}pYOo17A#sG=#!2WqVmezpm3 zN;ErAFcIS*^^KdUA$*|7&sU}CrO~H|7b~6to$Rw_{$%-cKtA!oa1V}(SQvIr_GPp% zc-?5)50dqgs!vMh-!KBmu-NOn48oD~Lh9?}-+$EFzIuu$H1Hx3%6V2*t35W4v9tKe}4z z_hk#%mvEdpfM5ly7lUv6o&q9~cHZ15Y`pGRoU7M(&My-?ilD%?Y>`*hY`#-w z61WP2JSSVwRld4y?Vcm93{%;?>KV*S&p-G>5M~th7;+{^9g(;R^RIb+8YqNYJ~q&j zL)}BR4_GRX6XIh=aMhG|ws$7tSbCTK3mkBx?{zWk_QN1fanYY@2TDM4BQRdXju{0J zuG=Wk!mbtM?imW;g&qoJ!x@B+Mc(6NpNgoyldE6`$}8`@Ll!gCSbn`E`jiF;U%hh zCn{N|Yz|y1rNb7#SqTmSf2e30>3NE34*7Fm)WwiKa5by?4|aX4eD4OeW$$7UE?Yo` zYA{}_&6_1fUfQ4b?sHEi;hX_T?I1*>aRQKk+vZKw8&m?Px`O0HWcM2j+bh@S37m>- z;uGD6IA7h32(C{j*j%O8)y^2{92gs*(d8ZeSSGpEk6nYub=ehQj0t8|W>6Z-q_r9= zjv30c2X}`P-#^*NvG*Sg0Be7J=BFrgh7fNK;Xt?63;qX4$horaRgjnj?eSLp2k6%i z7hcFfgQb@#Gwu-c*6_vt&p}{y5&jevFhDNR3#epch;ttHmD$L@u0YoV;T!4@H(0z< zLilSZHQy2T(G>H*D4+k`$x0)Ead=D%^B{g9mI9~s&eU^8%~!8#{IBPRW>b1~xFcsE zq^cyx5iQ_IRmjA9#)~L_`X-oZ=!qApkLcJ|F{pJo;~BD^-8xYYON;b+cu5w zjS=O3&{6TDn6+V8xG*J_PLn3;_5Hw))PpcXIu(Iw*;q=6eh&Qy9&xkt9o7){!*@Fa zxB+Iu22@&yTp7Q==)Te!W)p&W*Z*C7Uo3RtP4tQVi* zwxT&$F7j^_$*c5mRpaxu>0=$-dzrY>VZ+72-X+hmYnkC#C^n-dx59K55vUL~vDHMh zeB4YKO{mio9!iVr`)*J8yDfD#jvSbl3`LZt-F<5p%}Um69bgyMpoOKg8Lc>J2*Wik zE=e=pkdz&~AGi&*Mio6iBXssacQ^?i6c2hy*~yrvEo=3f2$|4!&`1$REfObBre zXxW|OY{B%z^|xOcf;PK+ycbZba(fA)lNf(@xhR7+H!8h^z3-%BY&__|<3mfm`l z@3T(nsZm{!d|ni1qZ)p}Cx$-ZH|cEF)x&Ct1fv)b&GiDY zl2_!Z9IbQ1#T>xo<=>6#8OI|KqitaIn`v{JhV(AB7GVWf-$^z{UNW5Z*|lha66akY)3uyVlPv7R)29|XZOr+F{fxETud780Se6ABkFPs4*8T+W zXw~ivRDWe?&&SQ%#Q{+a5VC5w6ZQ+QGRUoDgs1(=N8Wc5`b5sVLptu}!QiJnW(i!$ zDaF1P_n~Aecr&CL?%Zg-eM-g<@6T%H^D>^ZVz?1%JlFi3Ru{4^R7Ej&YutTj67gl} zk-3wwo#Srr2x9HX#}xHLDi?mgwI9q7!oL=)pYcU5 zs#2bw#VVaUwPZl#_>bU8Yw_z+OqC{#JlP=jm>MPCKM=`*l}o|}?(_PI`zW>VSX5S) ziM4Uoyv(*OUw4eey$jASVD*x)D6u{dplH|+zypi92d_C^eDRlkIHoElFZ+;j9aQ zZC=?0L>O5+h2!I#t6g1`Blc0PDe9`*>RlAGPU8|kPg7bGtIr;E2yvqK{LtV)=_}*@ zzVteA7k+K1>hh}EY-v}|68-J3yIVbi;Kb zLr6wgrJ&Frp%g_6veBQr zWfQTFuL>w6$kr-~{!X6P|9%zDsi5ka3#=AkA8+yK;B>_!$|Zm;vSngBag!IZJgc1B z-|L=kvO6`>TrUacW77M>RNuQXJDey2m&q)7u1}NNb7Qu>)c$2&!|wJGchPkq?)8?1 z*Lts7GI!5Y@99y04EBgerW@OJ4Ps8~J~%RWi^=f5x7t=Y2*#C6*r|6!dA{GMtbahp z5u38?jur{V}p+8enNow-)i+xx$`xn<+# zZfSV$Cew89?ms~LmH1k|e%mC*Sty$nheuPvU63k({_<#6KJY$4Gywv*#ZX{}H6KKZT2#eaa^ z*)7N&S4%|AzliTll<{6CQGZ@@z^^w$5I6g}h=(hyi&spP?{JJH1lOc6e5mfBPg*@Rv%;o-Hm%#$zP2(e+Z4y&_Kyk$E`ru zTP5?wPpd|R&>9k>wq;kw-Er}}B?hF+FQ^Th{2v3C%;$T%Rg0kXCtbff6*I+|oJ(#c z-3U3D5D$5$fl81A+UNKUdr@WFGfClgnGb**B{l@2;BM3nzj& zAJVe$AG9%$8(bmsFPx9L(sicWSsXvWB`;BT961;mkIP~bWwiHCmKUFFFXAC}rUzZC z9lVllM?COvW*^W!G%B2j-*GM)CI{@e!jlY{mqvxssyLur5q?izq9K8xLLFoXcBObu z%^3b^Dy9I4FA?Ea*@e(KQy}_?)9rPBA*dy|gA5&gfV-wR$e1(yk)@nO`O+#9-|cH} zeFtQfXbSH?0D|$t&ewE5T!`*F`O0I~%9{=Mx9ro~b?E)&JK>4q z_HxoKMW0ElPq7;K+m)|%e0{&C?&bsGz@Czaf1L;I&*$q+9KY?n&Cwf#lew{fJ51!r zQ^zx3koP&^FUa5uB5f-l^5HY3kjCW?q%;@94_F~M zT%~PPOaD{t#|qj6q1PpMPxOHKkI4eqh7JI08H3XYdeg2$m|lTf!QjN-9s#M27$Gti z_;^FJH()Us+|?WY;d9Pq@bdL#{hyr27u5}lcS4&e7?Xz?oF2)Ju$IC6Ny&%=?C+t~jECXzOQ}EV?b$LMyxnDQEU;s;9XX;rv!;Ir^u}?M63E~T zC3zkJJNM%M|DS1OmC2PWD*e$C1LNUSHd3x_v&j@q21oi73;1;l zfjHXCA>Wl*pc+j-iaoLj-jn_Y{i~JqXTj?byo>>zbDDnTz;JQkUNS;+Bm0^mRUL2f z{BHNtbQk_eiPbf|-(G(AfjV&8wrH|Rw0ycp-j4JHk`(Cs&rQn9fn3{jgzdaZl#cnE z%+6%2%{E)m6Abr!Suc{IGSgFrCCvDi%PsxvbgH*V0KRu6lf>Z&05m3&UF^h3@Ibkaq zLf&yfrYb4y(Yy&4sM{azw*)_U>DpV=B{&dO1H>e znoK-bi*6cTIl6D|Rh$?tPDFl{>1A?ldA4dzt0m8-|v{k{w9g%odh44Ep+4P4PDrASyY4 zjbrvH?jiCvt?N^%#7||;@Y=fL8W}pcbRR(8q(&y1oI6P`Kd#}o}v?a}M4V28o3ro@=vV^W#Z*Hn_#aWPp1De6Pi~#t`1R<&*AMN9ZH< zBQta}7tQKz%0JqetrcdKD&K5kghcR69}>J80mezZDs(Q~34?*1T_R-Gg17?le^G=hBGrLcEl>Iqgj-2zgeM$Li&L#BE zW>&X7VJReChS&79VLz`KBcx8?t*7p?Wutq(M)+1xlYdud!w$5GrpjTBN+i>0%Cu9($1ARmdNk zb@3Eu^fL7c`)Mz`cp|7DJNP2;aloEFS!_N!j8)3OJz&#m*P`@x~ z$YBKMbe-w4yPDFrr46TQA!C?Hjg5?}jgY2&7gLC%+~bx!`p3stnBJL_1m@<-PYR$d z5DIM>Bx92ehW8%7Kh}ZrzY_yQ$j(mZ{84jfmU{W-ec+YZsLey<9q$h>e{2&j z#nUpwnY1&un!3R%vgnV)w*3UY4Lp-~L!t?rk%@dw+2g@YzkAdI73ckbV`Mfv#h&;D zuU{a2Z3JGw4d+GER9q!Y*EOAeP<}YzzR6Vy5n`c`#bzBm-s5@sWXF+%j=NmcV$9MJ zL?!F7qlY#?1G_OsV<^Vqs)Gex(KP)!OZ@0}>oAX5X>{%kgwis#BJ`K)>XuoVcRMT} zER=KHRB}rKAV`z8)yqbBeF$SQ9N84X2H@Z;Y`*M+wh803-vcBL4{escITvvj1HKNS zi=<4IW8i9a0={fVFn^21w3i>sIBkc@&PK7Mz35&gLalrtb^D0#mp!09Yvdn7k#e+_ z>#f3CSJOmv`Y6!~O!)2LE1P?Y>4r_L;PL)ae6<$q_k!7MsYtVVC!ZpGsnME&5lpH1DXFuoh& zhG`m$JXFaY%BuMMV(tFB5;Jv?V(U7))jGPZHq%H|XY{!>%<#=p##fHQ;XS2|L z0P#000?%u2;|cKIZz47Oj!DsdHyDova@ZBqgyoKm2hPr(pPQiT;|@DsSHCpPB^-vH z?T@`((<{i{&cobUe%H$PZ+$)-dhcH0oZBz$WQUQ*AFhZcO_8apmZH>bVDwmP=z8zS z#~Qsdd3!2o7q;*&KhS=|}XmVuuqMQgM zPuZ6P>RpFxYFYPg$zvWU(Qb?rAL=}8Yh$2YjrP^O$LsG|rkLttE5j#n zga(#uJ|z(=Ne?+IYIwQgh1^x|mR2}BP2Y`ylCs5Vz+luuL@fJ~$2eE;Tanm zh7=_K0elLD_UJr|Q$l*tbSG;2(!|X;_Z9OujPQ=EqoCSZtw48_vS5zRt6QPf#aLT{ zZF2SuPxg%lcg+*5oPb?&$~Ip_QuWl4t~>rJ?NU^KGTjGm5q_ERNR?{Y-vVpNT>jC~ z>T%pM4jm7!O&@+AM|>Z(uuVZvA9_tZl|7J?b7iCN2oHIk!Lfp0SVH@c4EcN4yM2$| zG#i@CW9GMi@=s|f^!V!5jCbW#&0au+1Ea$HJhVlcnun5+O7=vNz25eyQuw8`+40{u zyT0zc1Joa@i9ULWo+3d#<3NmYMg)0XAXC%;-PE&RQGd<8zWB99mIxqwwiJvHA|UF$ zxMbYglVk|6B(AgfKnkvhCardeuVuUINWV;&u~k@-PFWvL{?22<5so~>Q@pEo@8R9} zeM!|!UT4HQD{tI5J$9YX6mhW%Pi4X3j^h29+t3--bW{7RSt}%Mf#jH7tJd(ezdCQe zix$ERC!_y-W$_7}9fQ*?ng=iUOUsE7_A3>vBo9QzN3e{g`u{%8yWT}NxAR`)a6SLY zhVahjX9@W%n0?_KWHkae2?s|kQBF4c5!jK30R&M=o_6^!I<($X_30lt781!+MLo1t z08Z*D!P>Wb>QdI!sh2cdI2}|LfBlo16*~yhvCeFYW3e##kk~Od*kNxK^g#9DD-CIC z;c8&22X30;)6o3c_*6S@!SjpsLjuKFsZD-mK61 zlL!Q`g9QDp6u#azTb2VkMwiE%D~glVFPRvGUD&ctyOWnkuNGGM=T%?-Fx2ZHaOjGI zVL(W)wXUG6DmKcGY&7;U*z6tJvrTT)t|d4Z_4Ln~TF;F4ezG>M*7#EtS+99cNxhIL zVc9YNafT{AHH+Ll`Z`$Qs{ZNKWBB0qdOw)0lUg3A^D|tG`6-D1vKZ<`9vE~hW9jCs;+5jj+g2_qem^E+K_V6BRk)*Q zJP|qg2V_XM>-QJ1oZ+j)6$CK@cIE??{b_^@832Gn+dhw+;!s(Gk!Z|%RWLgR_5g3p zw5k0-o8Q5^eKlr-H-VEG7z*G_SKACHy%hBeT(IEB$_fiK#+LI9&+}xDSeK8fqWgKb z`1%pU1(*~SUw%)RvJMQM@_sF>Gvdru_>$xMEo6bgSqe%sa`-#td@pe3XT@JjOa6Ze z5>TqGD&Se2?a&fL@8NE!X%4yj)9KUbfrCCyPX8Wsy6jrJ1{%XSP64W|;G6g%o-{Ma z?>y2|HPOI;qAU6t9YTZ{?`npL`f+CUzzV~Bt-6z^qWZ+@;|3PVZykPwbR7`-Vdd@Q zMdGl9BEDzUDck86@>o2^w%zT#BfWV)Ble^&Hg#I+A06iW&0!rpE){4S{998hwz3sd zM#!-=jC32U)>)?r2PEMBVR(aSL%+ zc+xGsVlGAQ121A|K%H)dhgmx!AN^49(0H;mcHEZB3}+Gig4txxvJ1}XnKdfU_5HF# zQoj6Z$U*JxVomZCUG)-g_c2SMV4TM9(q*xEE2EbwJ(`W*FVfZxqOD;dw!-OJ4i3Z?F~XbX z*SZv~q?p0&7e(Mqqt|Vg10q#Qh7p)Idd#vKF0_W{*VcTEJIf)$UHfGfrK0SyxdJch zj%)s}QT*d>=}Et7UW8aDjLs-m_U81Jf&iYm=SP86_1aI3>%AS z$Aty6s$;L#3XxnTmyYrgg6gQTef8grj@>D7GdC8IX2LcOzVbh@>Les`^rvdx6FjOY3!#}|^eOTpgCr%!(r{tIP z?CP0ZtA0NWo6n zKFy4OuhHqAtqwi}b-R-W-(E!hppPPHA_4Ia-xgddR@@Dp-?H}Sl%@oy__&lz6WQiW^Kq+(OnyzS8FalOCYHVXOYEdzsDSpb* zkm$OfhDJ|6_YH|*EuY}GaU>0zzX_U}+0Y{s>`svItBsfPaa_1`w*cWoP1WML(kUOh z`u>V%l2bRy`4bCpcVTYBB)v!(49T}=O%POEssAout;8;}C}+^*aodUDGihRc^sBCQ zTqWdcb$H(<9`Ey>e)t?iy)@*s&i%PBA=qMo|fFVpdBooDD}}8;vwz$ibP0GeU-m)XprZvOLmj7 zw`Rj=#Ija>l(&4qfPQmU7d=4IvmR99`!q=#9fD33Tzo0!f;*X8!|T(vPsDbi5(#u_ zv2+-%GfPz$^}#7`rMaA>%IdU0eG!JJf7zn%VyMPgFF8Z8uZj~(Csnb|O%-ifT1imf zf_ov%VG5gdeexZ*kCO0@FK^Fq;_*ypFB%cr%ivQ63d^=U_+}%z1GU)DQZAy(y?u885Z62(ucE(@>IwG+jZ>|Hsi)#x>df{m~*NCCv~} zgh_V}q(MMQrAxZI2ZGW}S`nBENP`HYBqaut(p{r-BL|G#&;HNL?Zx?Q*SXI5)i*{R zblawda8Hz5k3KbUPtO{No|ekLh*fGKVmTC(%R7gAQ2M?Tw~j1X#Kc;l)zgY9U#pfZ zzAlb&NU{SB>;UM(De32;Ue{~^7H3NdYt&TUc)U0`btqAj8PU<=@*n&mf(RRXekEY# zpmfm}a^2P*%(63>3@wvf()yY`R_(K*M0{{c7-h#`i!-T`Zpm8t@Jw)kr8W;wh}+E( z)a{w2)OI=9kU4rsBY7UdvJ~mw)#-Mt>pbDH`7t|P=#k4$xq`pobjeA*@LgnPkY=UJ zL^itpv!%ZuS)=sqTv!E#i&~oU3qma!MUn_RN1Q>j$K^X?%QXM)>%PeMfqstn+kjcr z9e>&|SBeiClp?3wG`|hLeORwlO5v8d?>pcSu`OXXV67PmKY6+O>|YKuC?zf2On77L zo&_dpbVX)@nKvn9Tlgm@V+;?v`XGT}lO`)Y4fJMEo~2t`%q7K7Yq&Tg5>uSXem?5< z15cTEipW3fck8Wg`NEUF_r{79UQSVfc#m9Z0Vh0yth2w$rvcxXy&QSpy_tu^@o4

    eRx-` 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 NQ=I|qYw+K~{{ZoflP~}P literal 0 HcmV?d00001 diff --git a/specs/kbd/lk411-right.jpg b/specs/kbd/lk411-right.jpg new file mode 100644 index 0000000000000000000000000000000000000000..96366a26353cd8e8b0e14b9fc66a9e5eae6d93ce GIT binary patch literal 132142 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≈Q^b${;ddf4-Lkax%H8i1%&uX?3~1)SxO2nLE+>*xo=_o!Ku_r zOrY|IUB79wlq;{%51?Y+scn&RIdINPsU?H_S^Ivx-*DmR5Jey;F=AadohdgeR`|`| zYB(>M5snOEd0Qd&eQ6!b9b4GoUe4{c%b>stDK}D1Yxj*~ZYLTx6lkOM-BG$g3cIxo z`)dtF%&XNrOVrY!y;XlFrA*PC{{ymMLB&caJ+*j#nU#4{i-}z6K=tV#u5Wv-;OgtC+=SbEd=EI3|)g z+9Wf^3apsq1JqV^*M_v4o5sAB#u+ZykKVHU)p1pi2aig7j%@+kd*4Z>H5Q?-daUF zCkk6VGn{p&KMoFlqMow0;ec>`>VrbsY(NGAfG`vc3XWVza0NvqfWF@2si@GhoSyUy zWT5W~a0k}Bd&U@F80vXB0%QDzdkmv@YVqF~WjtwqeI-B0Q60#Zhm2^NsyD|!6WMSk zk!+oE1~x1$oO7D>>zPlI2pwy|tyLHHs-O5z_F@nT>-)E_cDZld3?ARowy3#mbJ2RU zp!j^jukNrie4hURQC-)Q9O<%DS6uGF8Rt14k*_}Za>{iZkO|L|$oy;3t;h@5)(cam zlC`{ZATlbjRtylRz##EXo(L}?bd^MbfdyD(Fr);Q&N!#31Q34;cF+*9#Grr<&@eWR zfOe#EKIx>!N%g03+;c|YR+2sjI@gVO@qqCS_&k2_`~Lu*we4-f=Zsg0{6hZ#k&gHQ z&hu3fOJnCBhU*&s(i#J2c6E794;=)boqh9?cCPFe?de|w{5Bc=pgcb6Kjt$i`f(>U z_p$*a7r-OA9<|p}=_GN(Moh98)20adeQDcF;GA=u4AR90Q_RkJ#?w-55S0Li3_2dh zxsJV9Pqcsl8-j($V~T^!Kl990i4kMjxT#a~5CNzUgXY6 zQ{J+5_t|EEo~Me{aKUmo7_2`ME+UCXa!)kU)XuEE#$=-ntxi%zY&hvqZouP=deg&_ zj5={zyV&8qk;eE!GbhH#dE7qC_#gJsYu?KMfRa5;co%|PkB#wnQE2(w#y@(s?-R2a z2#*D^z+uK~A5*H9uuQ5vN2Uo1HT($Uf~_C~Q=`{3`5Yo%!0g8XR!~W<9^*>!3p-5VR(i`{?vSMLa6;KB;a86=CrlvSv4tH2xP#)`~_w1%AZ>7TO-ex z#LpxBq62@zA$q`YA#8q4UFYnOr2Gl+_c;FmUH<^1UbsKn1~Vsx?$jI~A^!l8uSflr zV-S1_@UpgYVUhFomFlPbJv)<0d(8EW1@E|f)5+s-=M>asci<7ndT|BV0ysYP%65aC z{KOHFNMsntT5E>R+;BV7LLSFB>qu7x0dazGPCpv?KlbIy!{P1YAL#c3kN1UrU@^;b zLG-Va{{U`fCJzp_08?)`9;4=3>BH$&9QEJ2V|*Mc`W}QbM+?Z~JuB)WL0~{0_43cb z;hh^nbA<YYZ#M*jy-BOJ3;3)6S)Hv#(l%DUrMIYmX{<9 z3D0a}6w~sP=}iY{>BS&ypK4nTGF*+M=K{IU7&grz)OU3vxAVufbDlVGx_T#8W*8K< z3G8ubI zY9r66?2e;N3^ctlnSmwn{CjH34 zo5GNLca2EoYB zxhM0kx9tkRoOGlPGo04fvoYm4TOSHs`8q!IiW6yj_PHX7izqlF88n(lgzhx|01!!X z@Y@(X$B;}8WF?91+k^PmSSG-vX|e`-(CppWRum>6Et$6qC1rp5-fM&qj zPaJnO(MR}*^XorzLqp*~U-(wqQ5ZQ{I`;kJSJM9g3lJX(KvV)Zzfbp?zGwJn8HeGv zk+h72a##KY)%2&rw#S3*jxqbm1_%4*xg^)Nm#aNBttIG=&f+#}cM5QE+PMoa1WRML z_ugRp9JZv9&K-+q_5CZW`#=(6qiKsCyjI(6VQ$AEcj0|N!4;$uL?DvRJ6WCEYcAF# z6&?DY%Cu$huKjiI41pmw%NLXg!oCWYAA!fcZtlQ2G>ak44qXP9Q=RZ9g{JVl5DcHF~1=#^CUmWL%>u6+ml9u*$|ye3uf1-l)- zr_6l*weFB4idork53P82?0}*_fL;$CUgB+8fde1%(d*meEj~jr7(D@^rTN*dH=-LH zT}+tk>r{1zjcjj9uHW=&M+d&cS`NizEXnfYfmwRon9}bVKnKW^BmM$vI-^;9EciED z82H=Z3^61v!62U49Y0$3glw4e$jHe2YsY*;G&6i`@DG+ge=g&8M^2UNO4|tMrYme* zwU43CgjR-rU{ku2_TQwn|CK-(@vlael)En<>S(+8HiH8wCJS)I6s{i8CO?f z9+`AN=gNQm1lNwjdiE!vuV2@jW{r5=2bM?aUO55580*bx4U8&2r-}SQiGSgsz8>IV zn%d-(^k&EDUekC+-a)|~4S1i99Lf7b_!|iS04=4+Af7tEBlE9jylg1rn$oh^%8ygn zJ|4I}6tOtqE;0DmR=6vi{uRc2Ig}p@z&Ru_2im%XlW8QLD+?p4?6!LGOlRAUIVY`F zHy<`VXft|r6z+yuLUMhnO9G~<8S{+rDD%cK){_D|^1fT~!9pv;x^NJE88w* z2^+T@BX#;$h0Niur6(X3JrBKH4Cl4aDfqO-K0f#aj3|9BML6&K!(Op+!^%)U8uDL@ zQwcsjcn5A6E}1DDciwB&WjO%x$*ZZdF{JL!T1T|M_kryl3-vSan^|LF%cQ21<8)m$C5`uUNz&E+v8i{M$zUR)qxdVI!dJUJazM zm-eI7+zrhho`X2`jGyaX=Q{xo4|?dUvS&3bTTB(Z^;<>k4pB1m~K7Ic(=r64dP8f&j2wP9kEGh zMD<6_p9}8NUyu35(j7SIVU~6(_ZD8(*GC$?8oD8#C}p1F$?&u}X4B zps$Us-;kS!eB>IIKO9>y1!Lg**PaNEe6BlF)(7WkB>Ge3w&M1ZO!Or2ygUA6BzJW+h4Dsc1~3jp>O=g`x>%0lC{X=}R> z=FZ%B;yeOl7{^jgH2C3(1!7DNyqe>_&f7ufH1TZPdFx4`bF-};Gcu5-Fr@bsO)$F~ z$0x0FUPGzCKTc~$O}>&hSlE)Mj%wC~w&kg&7is76s5O=!*>^ogP=i_q0O`GY3ZbrH zG@GoS;6KWnBcbE|0&=(4Oj{;9rYr5huVT0HrR*?(B*`A2b6!W_TYoZ5Mb{gC(dmxW z-@^`91$h;M)=tM{r1@j$bgScglY#{~Bcop%U-CAm9@QM) zG}IjM!3U@Ux&Hts8TpQJO!63!md_pOsHLTZd8}`r@A|>@_C3odfv8Q2zj)xcVrn4X@tZ-aL}rzm~uQ7Jg2rx21RwP+$m`y{i}rim z{{RGh8sy*&IR;PFt4Xijj*rD7(hCqk;Bk&9O~*Y?H0b2QgMu5>P+h>z39dg=uESVk zo!tKbDri1i4%@n#Ql}aHDUB!u20Zr3qTPxlU^*b+SIK|3N6!z2)B*{D6mrE=a&Fh9b5s{WrbhE0b7Pqi(! z6VxsaHtyt(E64u;Xn&i-QSCf}4<4I`_*b@GKpbudBdvJ1$HMR7;TkSR#$rdNbNwrN zKg3NO^=-;+=}{Yt4JZyshAqR}V6R=%{BL_{YYb8ZpJ)Rtd9O0?ZM$4)wsIV>5JUn0 z0DubX)(j})b#bKSH|ly4m7ub7w({OiJgKij>=nlQ^BmVu6Y;j@b9!>`^Wp0B`Z zd@Vz9;4LOMCk8S{;>}*s;f-$ZK(X>5d_sBH+~E4xl6)46&+tZ&&G%A2&*nAi0SQ3A zsIF>@_p&z7Wfx487KRV?<5j%o1jwv!;|H0(CbB8E8*d)J%%WFB^gK_>zWj^FH8rnC8w zg1N~R=6@H%HjOUKs|$OAG3m3P(zK(b(=n>O)9ByXB$Mz5!N49xm#6z}UdV@807e=E#NyOg3%yY$8cY9{cG0rdpw^tmp@wH61k@o zj(jV$8#@gX#djJ_jCTA>5)3N8@Q+Hr{{RaPRB!n8iHFqJB*;q;0Ut_Vvyz_w09r~4 z#W}m3cl<0j-ZN?%u@od<_JLpO)5S|!@?Fv&(71MOP_;uaJZ zwT%8IxeJvlzypkNiikj4>rkPgQkJJ`J|M0}ZBdV|;sB?A!oZAV{gpHR@var2+t(xU zq*x0dx5;dAm@C_Orw;EW|pE;t_a<$$Qb2kA*g z3z?l}v*USnD^`LSlH48(AtjHuwQw^af^xk*D@ZFv$sKB~>_N)87&z}v)&|?$@*jw{ z65RZA@PzROk~?iMw53M~9z%@RsY{m%KN{h$+U2}^uPaDi+BDOIXFLMP?86rdSHl%kEdC~38yj{D~oHrnj;<{(}kh$i{GxTFzt;-Oh6mWeisetvt zH3|jFTAir)lW)ds2p*yHNIoN3mnZCQ0qvUNe$HEyk=B^@%oJv;kX+|-ej?hIALyqr0r-KZ?K>cUFb)azuQTyfuYGeh%$&TRF+Fq5 zTM=O7jAE&4iMrK@&PSyRE2!L=^Ou0kR{sDUbO{81G1izIjx+QB0F8cwE3A!{8-1(u z+rra0_}k&62P^%#!uxJuYxE0yI}OK?z^=N^{HHuFT}a+jy-rYZR#IeLiRA(ZECp1C zc8yA}1JF~Oa9@XZ<_KEP~whVHx10<}AP5%IfkMR6z0D^Y^0D-8h_EkTXiB3Jw zRI!omTx};A>0LYpZedbz82i_NkJ>Xr;Q12&0N>Qet2V#1-i>LUmh!fJWm*&}e=8f5 zUd-wKFu<*4Ixy$U=d&5u$(d@Ym`-uDh0J1B>{v~{I{{V!N)_Cm>*(L=6Bprho z>+8v=yaoG0%i-N6Y;{{HbrBiDO&p4>7trRf>a`^vWQm1n#kjNSSZ&k-7+`kIJM4(8 zFgQG#@r3=Sbd}&~R|It*yie#U-|*BrSX_-R;GgdKtNig%?5f}4W%EaK+B|?U@&lfF z)W2p>K?4WUyg@%|Z84Y+?0cSg=2gWxziM4ETw_U`fIB$ik7ZZ+Ssd_vPi*@(;&{ik zFxx6P`D@3Q_N3BXOC36OBOPR1{W?=*{i*bf;AvM(Jw&NTva9^8r6})n-ZZif;{8KJ|wRv6O6kia?}}!_d>rBRq`Pi;voy!{vxe3&uId zOQ%YY{u;kR=rqg2gMfU*srGe0m5-VyxQlGy1*aQvkO;2{Kee8Wzyqb+XFW`d{uLqp zt8`$clTVSbJ4iG9srx#g%E3xICVQXRl#|EP+MzIFKtl2l1XqL0`&!rxfu%copD=!$ zR44YaSzvi1(B#;hmS+GCan_%)tNfzok8|lwI^-(|oQ{3@s60^`rjc@T22_quwS3Jl z?PwbUJuo5u_Ug*l{{U)DLsqtXbhav>92Leobv)LJg;uS~WjV&$YI^6wsUo}@(hM`h zcmn`)jmQr_je1I30mv8xcdvvzJ@GTd-VD{H)a-9$jNOv*B*S!bbJT;uuStXUwAPj) zCDW}-?Z9NlGwary!c|hb)fesKDC?p1Nku-NN>z*xY}d-?_O8|0*gdRi>98UE`Kazc zYTawf0w^QiKffAd`O^BmW%fu_VEUg}Z5$kAdsCGL;4#H~n;-36uQL#BQI{Q27lT(c z{{Y&9#F~uWL^^X^NI(jaM6Po}p;d1XRU;>4eNE)9N$4pA8ObAx`Q!c$ni99oY zsy!_E{#AEN_=oXh#1{rD4-MU;a0j1mgP*Hnm$Iq-G#b8#(0)>$-1<{mA^qHe`Pa?2 ze-(Z#Y4LCi)*t zeVI?qz{P1;pWW^2@7lgiZ;Rg-8AweI`E${Zo=N`z&}csteloOR#i8D#9t({){{V$j zqdzaa8h^_EkPbN7r?0okkd~QsM!3A##iuDFKf-!LE5>XBfG*nnv-goVib|wz~jH`Fe~~ z6+<>#k=r#iYvv$b#2&qBGPx`VLEgCTbZRz1kGl9AV~Y77_URd$!`K6F*=NW7_6>b> zJ}QK=u@bcr_gGI9mHjQDa{%C+kSwG`RIPpdgjrcGA0MOj|2JB{{Z2lwW$!}OGer` zJ1BTsy-+E}N52$SJPv!(2!fn}k`8lT3g5I2t@dP^D@bO@%S5U3C)ehv5A7AKM+h?M zii&wGW7MYf;xfgUJb=OMP70aNTMb}33Hy@UaI#(im_1_vDa*MonH zDFQDIJellJj8gU$S3pfY5$-PuCnF#aK~7l14C9*cw)pqrL7ezzU^COpCXv29YvUyN zYGLV!j}*SIP+ZAseFErS)mKuAN7N_-00liz0x{mcTwmHR#bl6eqhdQ7em|W$586w_?Ch&)6EN(y z{Xg;QUsbDZP`#o)p=BA!JclP z{{R>Kc^Dx0W<_Do5P$XQdkUS`-Zd_)`XbPhJic@9-n`%AEM+v;2zuJw=O6XXxO*>) z{y(}a<@jn)gyVBU03Q6ByW*DCE_^eo>N>T|a$Oi42+mi_LJt5A2kTl=r6|ccY-Lh$ zYRA?evNHLf0DK_oGDWEzpGh9QmQp;tsBPT}fnGEFAt@iT?}Sen`#XJq);)VEEHH9c zJq=+tl-fIBz0^XA^B!`iA9poJU0}LZ=LENs`Sc$xYZX{Q%9nC_gIQiHVww)3@kPHD zvofF`c!%G`15z^|iiEsQWKk+k|6_+#Q< z#BES(Iv%*171o1)V#mw4c|$9VbORsGy*I&MwT7js*{pXuak!c?6v&YRTcFPe-n|Oc zo|8unDWthis21CtVx;>v4my2n#x%c=*P5=UZDnnv$u-5x1&LKLxSy#XtvgWtq0X6n zZEkHNigj&_k^-epamerZX1NvjH+mk<<^ZwBmX=@aQ=EyS>n9lE) zx1~=X$J<@1P1c-%{{Yid&*@80O>ECu7Rm>3X|D%jE6p3@ZL*|o_T4p=jtTQ|kJh4p zj+UbE+x@1(PBL9&;2+M7dlZ@JX4|+F`7ONYa7J;!`q!3A@y-R2RUXDrM+8fgpTjju z_v3bYJ)>ApUAZ%>ecZF8i&ag)IXWp)5@&q3GT zz4|LbZwde~F@s+ae0BJXtKI7!7}p~3#pi|YY$Gwnbt{Gv{KdFG<6Y;5e{4NY`pzh( z@YUt>C;{#uK){>~o-3wwW|ERx7{*C9x}Q*elt@lRD78>BMn1LRR-d%})$I26@OX0J z=a_^@nQ+G^9V=^J`1`5&b61~By71-8UBcU4VnRpe1z~A)Mv32{>_XHr;AbAx8&D5S zSB1y>P|nK1{4=N|iraP=kFV077wtY6%$FK8wrvprtmG+d_Z;(2mP?>r9@O@jY=B!m zsp8)pZRgs&K>pM=@qpjiGCH5)Mi~BeFZ?wYo4l*p2#x^-pM&~R)$|0>?6TYQlh3t9 zac8~~0-TP9yp8_=X>C1If7zFB9EpGW)t#z-(h}V0(od!6(#~*5XqXZ`hI{@LmG-dY z`FA1I{7kWYWV_K`Fa`2j%Nv8p*f#v%UCqn)QDQe%QA1*+&km5}B6+&XDcT*B{|s6QesOk%c;mT^~;Q z0h=UqP8Q3M2*r5zh5JU?c$-j59VQ!XM)p88`|w=PwTJ#XYYR!~W^2zA*#61`9-LA3RR@uk>&19XpS8}1y#m|3fafMTLw`!M z7wu)BO7W<-IdhMiPyV$Ql6w!HC$<|^ zmkLkiihBOgiLTqr9+hO!x`M*$X9YMtFgd1_o7g$xk#EBOG`iOOS0{!gwT>9H>*>sL ztL|w5RwVTG{{ZV(uZu;ufGVI?{cGUOL*jMEf_^GbtlP}MOp5G?O91#eJd!!&W8S^P zLH(;B)vTi;z}&FL=1dHA>J4jBjN@q;)2Odw-hR)P&tH0S+k(~OpYYO_sL;l`Eycvr zutbU}mva(v!2D}pT=?&A;j8;=J!49nNt$t$7gB}%dRAKRV{5J1>1F^94m0aWZL!<) zuQh*7(ZxV4$R1c?%R1Eblt`Y{KX5I^fUIf{{WdDo?ub{sHC=0 zjs?`h+}{EcSI@m?Ph*}Cblum^(jFe4t=rO7MW#QR9} zXO8G4zu|NEZf*v3&QGV#-{W7PY6$fi`M#C;^WiuQpB3~Mn1do~N=Q@F_lCbjJiNpR z2a(2WTJFsu(_GqwSZs&tdjnIF7jD@902+ce4IV%MuYUC^+y*3f_O5H47AKxVCc>%$ zo+=%y@A*`z36efrDmlRF4KreTKmGMgd!G`)`!#qWjvr6BAb0z0zx-8kKM+4>Jqt^K z%cecd83cuCON{z+Uqhqd`&TLPB2b27|vv1GI_uN@m-<)nLG#Oll_@EC%W7?{ztlAyBT_Lwqh+73Zx= zuTlM{_m9}YbUb-~W={Z&<4(Ce=Ra$c{{V`q7xroJ2H-}QK1Z$0pW|M(u>cProi;^O zTn;F8s{a5p`^ok(?0HPTv$uoo9x39}O9X7;NgA$(OaLqd8%m2+??}T#&fmYnS}IqJjVY3_G<7o{i~|!k83VISt7WQeqgo@ zeEZ_Bgm&H^@wS_$N4`r7wrnwPm<1yv^%eGmNOS(pct^x&FaYfP7;)Ex}JgX^Wd+BF>GCTpSa^}pFP z3lIqe#2Dv~T7nC??mSm={{X&gm!41FZ1iN8HitJaz@G$3fZiUp zV0k|#DZlWbyaqY{0EBwfW4;gg*P*B+j{IVQ8*V%ru6cJ3RC(|GC_e%@C;JB9r>P&- zll~MJffG3J^}c;_-{W3~w6;btYB>o}jPpmdpK@Fg!^7}%!g@4PO=F|m#AM1iWDGEV zx%8~q{toy+Gc#ybZ@aEz73f#85oE!K1%@j+Gg?L8R&vzQ*&cD?-++D#)iisJx-@pP zXL`wO%!~;78uE_?d=Jtr{ASBJmhKcI$%1dX9G!U!%r zZH`axBmTePN_DD5a;XI>ag|%NdM2OnSHg*HAKJ8wNm*Bt(5?sRS~lMaJShY(6dFam zP|L%taey3Vy7?nlfTQsnaM<+kT%W_s%ZV+uNN!|((O*ijq=)8I$Se4BStjjkoekZT z8{kiZK-@e(XP^4yDX@GE@P(@uT^`&P&Z=2@wVnSP~Rxpr{+*zk<*OO#;vkpX$M{Lt~Mihd8Rzjil9cO52N7qCD#R;P-_r zWm1|gmKbCc0_XWs#qi(5MFO1`#m0IYWIxin?QPh+YuGMpIUKGIaavuqxy>m_OGbFd z#Xs5i!k4zMd1Yhv8@zI0Vg_(o{7u}c`f%NFAjUrwVZC;efiR;2x(E%Y?Q#d}8H=f3E^9kjEt zh%5+6QIg;>KaFZGp8zBG5pDG`kMO0m#5Ra=j3~hTD~Gx9rmby%Jb>BFXC32P3vi4k z!02~p89ech)q?Uhl3d!I%Gg1J`-rf8RDXph*dWLrL_iPvW*r zpejI+g#>_oewpb_(7bVLtLe6Lva~W>mI#l*I49FRvHp0c>IV6+w_%SaAO}y~ulQ6( z!WC=?V;}GZ=k%=Ud}F6WHKZPTw6{uLC0v|X+|l6pYg;BbC4;bpz-{ z7q;WMsBEGu%rSA_%U|%Q+SVeZ7$V2}gZwJadW@V@Qpgl^%`1a2wQV{P7W9dF;Ekgd z&&y>J%E}aAanib*ljhC$u$bgmJ8;0yA@{3}yO>m5x}%8k?}Op-9h7kFU8vb$R30nN ze`o&y3&G)Ej+)#M0wR4N$%FhS&Qbj<+wRC{m=8+xKZTLJza4er0)ZZp&IerFFZfo? za>d#1b1!;G_rs~mml33BA93Rcx2wx#0P>iQI{n~K{^asL1U7_Y7wc*)=%)$!l$x^`+BK_u?`G=m4Y-CY=e z;-i-lA9WCXKJeC_G>aMj%L`3&5;GYi4UB=uBi_B^NceT4+S(>;E#0s)`=uYqSCD)@ zk2-FIq;O$`liNF1zKe@$E&=>8T+x)LQQe*Lgkw!4j8Wj79hYNRK52PwTrE_}!0D?4#P){9{Adi%dfRD=+=n@^v zj_207uND$C#vtwaha>T<+?v>z1<@QLXgYKJt!HnH^zv8yE5^PuY4)B9xsLAA-wALq zW69bWwgv~MTK3o_f0&lsGhR3QMFTaBk!*pz0MGq&u9^~(sE#_YQdVbGr1)b?(`}#; zS;F!>Xw34&tVtsgz?ux(QS{4cN^qsnF;VSK{{Vy!K}=^&hww_>1!G=1 zp7gRywTC$#)xGsFQAQB(9)}ntY0xSE0B}=Jf^;>(I&>X7Ag!4vA+R~77dX#)ZLxBz z=wiQubU*?A&VYgHg1N5}_$y0_+|31?QI$EsQC-xHk&Vco)GMRrZXRcXn~jER0DEpsq8I z>0V8v%bgERARWF!V0&Ya>0bBXMl0caEDQn(zRQ=gR?gTXo^c*dUw++zVi6sN&@ z8v~s>9lde3wL_fq_+p#poRudysn~W#JiZCh6>>EAzwe%viLZDwO%}!Dwp4ZKLH#SO z^BisjjCQQ8W=+_L@G2d1@nK*HJJ`DLBS+>?_x> zt=FNiCHUWaC7zcnqKN}Q>Ot+EGy0m=gqoV=Fq&3AnEjGLgZ6&#X^dq3khdd_WP0`q zB+3lnl5%~k$-iYt_kPd53i*x=ikuGLGv>Wipk(=ZIjE`pNqU>dSfPz^D(`QXE6De( zUlmMa@Ybf_5X);RIb7r9HL^)(9GtIgahlBWJe%~LLPj9Df=&s*BWbBiQOfEqAD((1 zsGcP8)`6j4*)zj+xVM`b0}6ngWOH9c>DoS>rb4h<*<0JijAA&Hb;q|g5Gy6pmz5)mEw;HX?Jkk>bK86VT&#zl%T*T z7#_Jet~Ab>Elmi#Goijwbh~0R&SL~0(xm?Ygi}V30BM$)^)Zj|u5aN-hUc@=rPS^x zpLP5B$!#m{5hqLzE50yqIsSCpcNL=g9P#khkfp!kTWOzoSNti5K+_NaG|Nyx=MgXX zS48%uj&}5_w^5UmkWaNfXVe^5W0}-^C#Bul$s|^h!z5~4G-w9^A5W!m0>%lDsf9Kl z?w}RwYN2gzcq8{RasL1THRd*Qe3;#g9+jjUWKApB@l9{WBG=-TkAr@~w~*aPWVtx5ziaHO7*yO+dVel%eJ(F2-N2h#HtS-!`i&p;v6=u@z21f2)0cfoz(M5o~+HZ z9DWt*cQOVUJRH`QXC{)qhBRXo+v;^56!5K$-I%?W1(l0sK^Opz_^yI&151uM8LZ(Y z21}4L?nyOY!MmmK+$;&?o|VpgNw}FV{5_{hD?w#_edXLbwmwW}la4xjS2~kAUYngH zdM=MK09e~h3E+ST&(u}Z;hidF`Lw%cAZK$RCb+K+Sf_{nA~us?(w#C(BP+)2SVb@k z$2|!LIImJzhR;GrIj4K|B`Cd)c0UYhZWMoI+J*J*Q{TW|_`=}}7d@ai{aDc(M% zLgyLnT&_>Kvx-HFe}&!+ej(EB$Wzaf20u!=-wFIBD983xMF8Y5!5@`nMWtK#6U5pq zT4|CyT}#Y@Xj)C-*;Pm*J^J*oLudgTPJUk0)a1I8%AZ4xo8ec49z`G7F*5<2u&8GE zTj5RTevNKfMsmrT?Ti3zBy*F_Y6K>2~nU22}Y< zLHxyVSH2a~ZWe1fZ6Z)k*7DI)9=!#7Nyxc%{OwBrP*1&2>zjOn{!*(lar&z&hZ6C^^B3zI< zWaB2h23eMW+Fl!T5sB^N^8qIzw*!-3NlL^gPoXuvY02`dnbM3?Eckarveh+MB9;{@ z4(q+C7q){@vXb4Uk`W-m zc$;gFp{`{7&6-_Ni$B933QhjAK-1qn{DeQ!sz1UX1wZ`Dx@#Qvw_K0Xr~d$i1#mX& zy4vIZo|pdsh^uzK5NkV>l=uRJh8Vm^b2qsziunZ{C^{jc2!}w<@su(CvqibwLVMHz|p=n>Gprz z)>E8vz`jTGuh7`vYJyHOIIqte-9jsmj`~6>6_Is_Ri7PB;r{^Euh59k?v%gGcpO&s zb+cwv?1^16K?ekk{b+$*F^m=-v}4QzZg}rZkZn2L)bm(sY|${eDp()AoSaeipJ7zp znE8YZj;aMFB>w6A=&&SsBxI0BCb*A_Q~6#UY!S<%l6}uL*~gH0JlCB3bdi_CQNthl z$)|{8r}0$CNglDH+pHQkn2Jau)(|u6<*j+nm;V3>5Bw*7EuTlUv$%`Si5T3pzgVka4S3Xf6>8utkw_XUq?@V$01eeqkuw&i|hGqz7&Hva&PEneiUB#))7 zP+QvD#j^oaFFf=$o8i<*d_%6JVV^!knRm$qhsfu(Ze326u*)om3Yk3dSUwokEc{0s z>bACW+Lu02X*e+i4mQbGtdLxZmrV($>ikL6gDevXO^f z+}7~e;;ZoqsK`Zx#12B&3-IZLzB5g{;%uD#8oPZ~Lb`11Kf8hX*AMWN{iDVt0-;ty zefl+JQC!x8YHa!nNdiL5*a|s2g>pUsi|vr!>N18mGTliY;xY1r#dLbZn6$fw5qae! zE#+q$@DCM3!aBTq&W8o$Hs527iw`IJq#k~>Xp6JCx(?Mn#W9BQj+Ac5KBki_S3N$I znC!$Xt;gk6q&suJIqg&9=HsN&~)C^X7^~tLmtljfxsl>|$hMEuaK&-{6OpbiW!gh4YL^)H22=epT?daQX!O!!aIOKtKDgqzzk|y1 z=z1GVF8Ll-l13fboU#6Ook#AQ;q|Eek@XBp9uNV~6~$ltK1qk#(lB)qde>_!IXL9w z0QAOxTI?<5*#tm=xB=7YPHD=Wqzq#f8yY=M8%FR|-M@)0Zs&$CB#8)=+!D^ryn;PB zG?!i+*CS0TTX>+B?#f5Vl24Ze5Dj z#(axMiGU%1VtXIPmrL;7#jdY!b0I_J%Pft7jPB3)*F|k{kTT)UI@GA(GaOLZC1-TW z0i0(024w(t&0ufy7@X#{d_fak z#L$eW1RT~%gC6BP*3`~=rF+5zP7kGUzXzkw#orXV{H1irmp;Gg2D^*K434~XJ!_Kq zHi~{Ec&W!zV-`=hp5Ogy(XB3F6?r4vqC9(yel+PZ{o|bRNdk?8{xrhHm;ibl^IYd( zvX>)_XTEFWZ`+XPT+#;xe#-oh_lcK_Bo1uc1jG_Um6h{4|7_G$_afc~PAE>;}Gq-}0%z&2z_D$(_|c z6>|q)@k!C{RuYas)^4`HTj?jSLW>8W&H)NBXV07oNrD?5> zech4XTWi+yNp=~QB)7)rb^vqrsi)N~qK#yGh=fn~T)N=?wZLlnJ^NT+2DX`lPN!^J zU7a}O4D(gw&~9O~(FB%K>Q>RmB0Ma>Hs)`Twg|u-e=kbSOQSSbx!XhHTPxjOeL6V- zxQaE9f#`qF{{XJDyj3at7TkQL#a7Yu$F=cg^})1cifc%fWH`dG;ea{G?fFyuUnxr@ zz|SL}&XRXzRJ&RnqOcqf;y#t*{{XZai7YJxU=?I;zx2=w^})M#eJjR)XlWWdTNKC{ zbO+z(71Kr9Xyd7S9*rA=ExL9kN9kWiTeAq&I%CjR&DP-ks>25$x&lb{ucTmd7Ys(= zJu99c6Gx#@-YAo~403%dl7EO+@ZLy|Z8BP=$JxHpMpu6W9lMf04|?jz1a9P44W@W8 z@6GtXy}5g7Zw%tl5F^Mr9XULa`Bv)9>R@(XY=wNrGe%11cg#5d049dLh13+4A0s0S zFh_G0S%_OUe7&HO6v^bN>JXt?0Gw zB63vN^sO3F+6I_THvO71NdEwIe}#MRg7SPbVh#Y={cGplB$V*}o}(Y?7apH;w4M zn|Q}c)Z&*?)pYw=Zf>4fVDb^LWr(VVIrgrEu5#@4JsRIthT6Y$p5k_}+yOAS*@BZ({eb~;~dCqyxeP8z#$zFq))cANu$H@R+q4m9|&;gBGa&zqYH@uBOdOm-TZWZ6xRN3jz?sqjAjQ zR@xUh5gX>>1Mexj1bA@P|AD;`OrL|&uog)aJj^MCTreU*@Olbxi!p=hw1WAgsW%%` ze2z9RAvcYxh(RLfdV@EZr+^|NIL!Yx^A9@Qw??MW!H8?IVB7at@mhvlbYH-Dl?sAV zJzxNk0U$zJhaL20CVG=1csWXAKe$zamQR4+xV$b#y*P4fTg9JNY}Gd^Z2=S_9mA(8 zlsu`!Q*@^xp<%n_Y@?A~2nGqIM7SZr61 zn9eb_LKhU~%1+FZDDzHUa9L!R1t&(A5|)V?5hdsKfT=m)TN6}hu%hbsF>j5Bji0no zze4c_($N$l#_Zd<%2gmUs46Eo0Fr*Egw~Dv`0C^PaD+KrZo)bbnSE${Dlb}7fZvuTTs`mIHLbzIIk<*NrV|f1uAdPMObV7h| z7kES!q4T;M9@*3WK&4Dfj>L!>t_8wW1hm^FF3Tyz>Fl>JD%j^R^=n@lF`ueXJ*>=$ zt(NC+ly*5LglIllP=aEyU6)xG7-X5b?d^uEY*!^!QGDoi=w}~A)A!wQ%i<%GdHrm_ zXA{Tutwneqd8Z~DHijB2pq5Hads&b=Jm_(tRhu?AGN|$~FqOeqX-PqWfNC29D9@?R zk@G*O1>yWG5!;HKY;)CCDDsy2_s`@evx#Q<49u%q&2*ySLF09|^mI9VDkiOc^Q7ie zWSG;Q$-m{t*{f4=sf>tDB^1U!jzH|ML&|^{)r1*a-u_4Bqms#B@#@%JiDolZLD1mO zBa=`bWS`W_`g->D1#@H7-9?S0vk@2;!}%1I+=e@c#x(S(#`}8Zk*a+Y{;Yp9Uc@Cc zfX7CGTv1p?m6d2cOo7;=z`Eedj;Z2caTrzfiQb?&7RnW{pv}xLosjImzD0GI8{Uo0 zc4yV}z|munc;tRamsY}?`-bd0b9^ETyEM+aA2Z<*%Z*S9qFo2qTk0Kg*m4LbERViZ zoDK3tgzoLmV^q{1?h(4}4zWQM)PwUU6k|Sh1V?bFZF}0sHH5|obG}WX+Wx>_7?#Um zH-qG7-S>Od=Uyxci+T1qc=e`m_fP);RBnys?yBP+)PfhM@E=NDEXf`w5PZ9}6j)vJMU-#qqAqxYf}bH3GTI+hpw zHhg5Riek7rQq0y z+F*ZL=tayEk3oC}r*ltb=;qbDfT^9CEC%HXAbsKO zk?%wD!-R%QT)MRvu<>W}JXvrNU{74Hg=_=5rAV@TmwwTJ%Y1htb87*;K@L#A-9sAR z&7IrbKJ>GCuIpa(yZNn>qs((i+~`@JqbKPjhb7yOUicOc4-bRa z885bJfOMtF(R<*W8A0WpB1tZpfaKD+WOX5}756?L1SNMu8wpl1O$Ix@q*6W|tAsJ+ zK%g@8(7QBdXMmsIakbQ|L|}*~jC8Vuc`FQn*OK>3kurP7kwF<~5NBMp6e^B3 z=jl6%+IT?KF+HTUV-(^uQ2|uj=H#D0KIGPULU*!1_j+CQKhqz?4ag7Li>)+X>TM}s zQIS3syDGewjNyp97#x^llQm^rYA$ZGc9AOC$kv~nPN*}LVRN`-rLykPTAts3;d`xA ztww3}R&y!(k3iPlmI&-ew$}2Jb%ZkB_ll-unI|c}8hGixQ~lgmZ#=2+MW|+_w5BA5 z)V0NP6fq42&fj(={Ig#>rhn)1#TpYpgoU+a;g~I7t^Ci&&X31!mYHRYGV8XDutB(J z!1E)QT7|3#uST!|6H*Kp5zD*tETZ7fhZaM;F>hN#z0O*97aE*xwpf_Be^50@`krP~ zph@3|Sgg%1caS%RvMyg9w8fKLo)H+DHDBS?JTgjG`^$E5lH^n4PgC@ppr{H)AESd@ z?5&LozvSs~CFijM*QaxsrtqTkjOPE5-;kBdcMZ4;s4Ut$$1|WgBpu|oGc6OzbtkJe z@#R+2BCY;xKSvzs?haeW{zf!=>ABKdvW590gnLeaqYndj!(WbP%xtl`x_5sF1*8i~ z;Sn5j9?B(XN;)nP0=)iLP=&p~>%VIFL!@V5DOOn8omOGoMYR-)pFFACs`tJ>UCYcB5MVk z|0r}$E>_XR;>P234)k;o-Bk~S&9Kzwf@nth>pxkNkqI2>Ek`J_#%6@OIez)|Y)JTf z0By^sNRI85#6X~d5WS74XNXg2hun6nCB{b~c3abBX!zdA(0EYNsZb_($;wk8ixEP& z(?LX>14fx(M0C9F3HPxx(~h)fz&ismq>(E6sQ;7b$dwYldS`p!%<%`@e>n?oe~r4v zAY31qF9C4Vsl-HTHw|M&ZTcM%MDwD^;{kD2P^b^e?xgm$8|8eZ*H6)^)ra}oD^ ziS4Ixq@d3derNqbJ;`LG8Y)|n*ZF>G_T{`n_pE2d-Gny`ioxFb4zf%t*6)?rW=Fr1 zZh;0M7~_pz&}JSl{m;TL1T@Z7lZjJo?$ThAYyUnEZYT-C` zIRs1vIPZ5^Jx_Axftjd;McTMXRp19RPp|2li1u*PG|uqwA(1VnIxInA;iOud7(8)! zPGj!GoQz4jmR);M~MIOkIq@X*Wop{Xc-lcH*C%2EhBD>2-Vo(}D@KZ7VZdIc*V$^&0p)Lqh<6rO}sJ5z>v5MF@o zo^(Vb6F+Q>5alGj?!Gk`Gj=?laMtxEE8eSo3v=4;py zzlu*|UV^>-z4^P%N@bt!yUpTzaw5LF!bZjoYCFOP1vFiQ}(D+<|=u-CN>}2{@{zmWHC;} z8xM{T5|q2`hTvih)_WE;H#*(L?$unv!_&YdPFYCP*87+FNz>B!5FO*q?Gx73rYZgE z$=md2+$5lThqyi>B67zc>VNKaf0^GL4RC%T?^~eZjPn~63mdV92bQr?oNd3pr2P5Y z6rU$t4e#!YXZXo3PF#T6()?WPB16;Q`>eUTvH2P}TKY=@hJM#~@;xUg*`G>lg7z;` zBWAtmgm`^W-r~F3T->?&xvv)uh70ZX1fLgv$myJR=)N_)r-l2t+-uw~ z<^3fj>ff%v`ZVL)z5f8RA~WwcbgFloFpTb+fE?;LqQsi#qdqR|)b>Ea9oS-aw(^M2 zfY{HAA&9_{?z3-+;?>xbg%oK+2;&zKYAKcYx!4t~sd~eb=u!vX<>GaUS$NYHk*CBH z&SObs<>i$iyG)cxBL-eCxWd1$cYgFaF5MB-;D!~psULjG%$^va92%tZ5G?j5sc45f z(c^=BLLki6K$=^FaZ%E{$}X%-BojFR;%G+c<5id=DW&tky~^RXd@+FQW^}+LM`v8y zgjVlba4aQNw%$TIp8mp#WAqd^$hl`vAt>d*-iyJciutVNxv*w!%{G%X?y9EA!1^}B z{K&b4UfNwSd}dDPRip*$VR3rq6NT2ZkVvl!lx|v*n$72n;!FMpF;3$Ze4$cT@Tb}g zea(#S)g25#oKYR)y$5n0jry;}js-iFScc!7!-w<+y~K`#cb@az=_|rC=4%l&4@+|s z$<<`!(l}Ql=j}f-piWPY`3=+uALSfx$!&YQkCx}uLVkHo#AlSOdu4}``Li*?PctuZ zwDTg(_0};Or&!oBx%*NSWSzZT(*|hO%;F@E;{MjDF~@8$r)NM9z~gXq(rv_UsZ7Aoz0 z8LV((u_{Qv?6ez62^cr&Yqm_rCBc&C4s6t)RO-S65}nSaHVvS$nvEW1TM05Rt0wOp z81i(waY&pRN+&rOBro5T;n8cXJUE!Y^7+sjr~A=&Fe`a|GL5?~e7MrQ$aY(Y3*k_o z&Jc6>v~Yim~!GyG*W|)RI6(1ZJ-H9$AeLEi82{y8fCAl7K zq00ap*dAs7r9AHv+3RNmWLanW$G*4OquJ+da%cu090y|ZNRwo{;Y@NGbts;!ilp}M zj954Z*;N^gG7<@n7<%Z}ti-@r)4bj0)s^Zd-)|)K7Bqll&mcWwY6Fu`XUk+O;|1nZAn>b`9?R`_>dC=?l}4*Gd%c5Z4MCQnc9g-fBYvU)jyTP6;P)G;NjY=oJ7bPHsjl}}KsP2aw5YbprIEp|u> zEmo`SPmC^KP@;UoSku6E_`;~IXZSiJoVRr6oz)=CKqg~r>8)umHD)jSi%+N!*zpTj z$#@q3$}weis_(Ecl)1;wNOmtKr1g#02<;d@zMT4s@>N3a@`~!!u=z&-xmUOz!I&cR zUcJu5B}DXjQ}6TZGPU*Bei15}GlqZ0ZZkUALNbAUR~SclD+1tQF00%Q>a&B3Hn%>N0mn}AmA*ly<^t_oUfqatMa&~m zMzDGCjDjs@exFLo}G=a-N2YuHF>hQO{UVl6UdTH z>FPFDq)+g#QumEl4krT}bKKO9yjPvy8M=i<2LIV~l4eoN3%e(D`sT=2ZaYlzO7mN2(-bcBBwO@Hba-^cNEu%w zPyYn1&_96^8Bik^mj^doXrF%%@STX;O7s{FWNdu0;+R&Q)Er0_$mm4fv*>7S9FzA1 zwDl(Dr!|1daiI2ETcIiB75g1yO0Iv>NiKn8cN#MuSs@|3!uy5zLlz>Ech*hI97;sP z5O^&-vOq-k51-~AdTM8K=iFRhv8ro<13&y=R2|LQp+S|h;lTJ$wkGwr(bkyEQKSj^ zOU|UZdW{U<+TVQu7!+HbgE=IGlZr4r$DunMv>#Fu5Emb9E++D9pwv^%D3kyQ4~)qA*8uJ#&T16Y|p z{|{H})}Z$-g>vq0{J@jK2p5ija58eXd*3u{9FRi|kkV#6pp^`~6AD@R(#7+^eW~0j6j%(82Uj$03B?QSP=sxgwMB zT-)S6Im23s3-h`!+kh@n@1Uc-0T>;qrH$W_8R(;9Oi!bNpVZTgLh6w*za*fRv40@M3?=I1dw7`)ZnKtHKL;ApieFVuEnPFwkvbungw`iGM~ zMqtplz~Y4hh(8Rv`ag#F84Lr%sJw^ zEbS~?W@vr#Mgl2wUtIr3En5~{E$T(~;j+Bl_xSMUTUe_iK;N+576)&)!Z_k*F7P%p zG+()+kOmx8MTx#W!DM=GlF0aAaOCjJ>#uim&t7121>hKby7!gVpROJp`+jwUG8unl z5i4ycm7h#1%vrg%jIX#aTXea1Eu^C8dj>n4*?xRcOAPe%l-4>oP+Auv6M(C18|?W? z612+m7Gc(jpuP3^cN3{mC9s`KGPnkRw&`sGeq=%c9(gHEgO^Ed_Gn(a1+6g=oD&9F zEW|{#ySNMs@DIAo^gQz&>ZNFHDtP|(r0w^q8aKbToo}#<%h~1&=1cn0!q!sWR@Yyz z`?QMJU57_KS%`Z%m;?15qs}b>MnXL!8QW&3g^SBS=oseY=J(ak8^6m>wAMqG-YJN1O%$$Muuc$&aMm*KBsb*z|0Kh%(nUOb1}QXXO6LjmA6}zu&PH2HtYW8 zp`&!jh6>n(=2aUkL=<{imT~rU5vwTRoiC!o!S*lZ!X&ik1EUgIn$(FpBhQ!4ooE`w z|F6EtHow>qZGoZ2&U>+Z@815T=Y9WMBjaXtOWp=d%Z2!Ey zO%&am4KBji>(vnLT7)rD-~gZIn{G`y;06U)Q4xrBV+@Z)@7RogxP|4A0{*SI zj!|CR&3{+&7odZ$LP#)tUw7AMy>2Z9h z`6xWxoTqgA-WnMjUax1HnDls-aAf{3Z|OxUlRbcFPC;-?OSL+RV%_-yLg+tSCn-qJ zUFKFNN7f_wb}Hdd{oE#Frl{@M2e<*^qLMZ>24G{U3$^17Kx`Sl=B6H-8owY#8wT2X zIu}}F8VTs_boA!iEU~wI7(@$lM|Zwu`w-BTTS41(k5ZHEKA~L}?Q`<8A`X8_iu2x6 z@!?z@gVTlsEcN?t{P%4!r0;R3sJoZ{ZU~cHGQ`-E!#Hajr@>xVCsL|GPFe&$%+*%v zq(vADVm@|TQ||*~0SSfmGyDR1C>Fw7Wutkf24A}O!Dhf+62?M@PuCW z_B1P6Dg!Xe++d48dJ7uu`}&RWwJq}&Qyc58!Ec9#2tVQ+E=P&{xPAMDDYRUlj=$%4 z*LX#LE5p2XUCHgai3{qwIv;?~}mAf!YltSCd zKeWb)45%h#urcF*zy0iZG$}G%`;8sAQL66dx#>xEeh2uRXGe*LiXoiVZzW-}?aWFW zHG-9bI5Ku5va6KW?fg_1@!mR4PoC|4HUfUH+6-}cAcpx47bb$nKyHWJD;(e6sKUJF zM7E4iT2=29jH_A69IC1CJCrd9!&Q)zZL1Fl%|&Si!*j|GRxqH?*3NW&6_Pm&c zay`zD=KiPwv%g-yd!v5$&HP7jIm(ps>$YOOL9&1zZZp{K$gr6HkL#7>%eJ5m)U{m; zA~%w0Hhe1{-|zM)eicP`u3tA|o8;V*BnSJo7ee~p4QLO5Uwlpa58w>By)?TI`t{;J zfRU#(CPAJ9KHIjvxEDF?rT%u?T|rP>bNzeP!ajMh%*2dFa_tB+kXu1F)MwYYV97CX zdCv8TWZ#b=hS~wHO}VqcLxM|FevmK{tW!XITdi!0F;`C|yz*V2!$cIbePUMgIvit6? zTiYhqXU}JUof$=QK#au*b?ow>JzhmPYy^f^^lAZi2_km0Rr$@_^&WMkjvaC(3?7%| ze9z0C8ipsy>f^Hqr&Ng5qa#kgUi0-e4_d(4J5`)NE`Lq!9spGR{SWY>{I~zumOUo1 z;aAtASa;Rrl4*TDkUNx{prYpIKczIJmOn!bsc$STb4+iM!v5AZ2e zIfgqRmwe@VeECd5`=xXMK(DU>Kg;8yN_6~D5^a1o#wya6mV!$Q)7=lP@1!2kAXEaF zslVkJ>ON9aaPqGyus!wpHAE4H4?LHy9RYfsn2w{{H}tybk_86eTTcDLd`N@v?6XCV zYc(`bT6yzW4}oq2fBqJ+@P?ps}__E;^y z=2qgo?zcMwipB?ZBMEg1&(SPxry8*xbgvBVWb_iOqD9_Vyl4}(S?~Dubv@dK~8wa6}AkfPUSVZ1VLVj4KG5%`E#e~E~DWazB6cX7?j_#XWC7(lhb zv85};gpTr|(WDO+ZIIDYvb#AGM?u!zWG!AIh1-@H?iCZ$~Y3fOw*oUHbWw&Rv{$n}RH0kCaW))~&YIQ{j&y zJ{@cRkd$A3n zy!I^1e|vmlptO434~_vAR^{GNh!K5eyC%vh>(3)Z6o|>DJ7|0+@o1Oy_6v}-ksMR6 zNCih<1*cpxA?1~|2_q3KVjXmj|R;82^HK{edh4dy6diFK(-+uwIe<$tLwCE$~J$R#;wQMZ@# zqYVY$cNkVL=QiE?eaIF)#`DR3G4(Vlf5lwUje_$m>_$d^8}5ke{Jd6Ywib3#d=alQ z?da>lwDP_NfP&$P9fB$(KOHJ&N)lOX$*S{JU*XsbL}tYfq9}W~jRYdYC)*mnNj&c(ckr_rMC_>?Y8OHaDOdk}43j zu3^mdeI^Q+l^LPnoFk#T6Qhl93{xk&3$1^XZ|g+dsGOZ(j=yJWC9o(#ckDAa7SGAb zB#3l^X?({#F>3psGs|TqSxZBK_l4D=Pad!Pr1$~2fF;<|y?^>+h0+a)DFeL^PTW_a z%Zt}>cO`G{w~jeC5X?oz?5VYQ}8%lAsxP7~tP^3{h=o2xq#JeXe z@%-lEqOwg$rLcUvkHco7c|+C1t#FY zfl!EhtS69R!*8z5p{PTT8L-+8c`#{JoJT@!)qemgIrTf*Y@yU(cl>((4Ra<4 z3M18kLnhm!ES{qi)FT2okWw8Vy6Hv+Rh5ts9lFyeca)BJu zcApO$oND%72FbCtQrXB0JRb2^G!SNpIky%yEbDeI+F$i5anj&@L*w*`E6*vbbR6pB zqcf3Rab+sR9{$Xg)qAT5$qUK0+SiTCo|xc@4J-_F1Yoh*=!Utnz3vYPf5-)M(%3ri zlDfaGf}k%!p%dm*2OaCTiDgrdx20D)kJ`K$2aj4buDFChQt$z{a~XqoGUyLu^P|1V z{xq2X{{>eyg7VGc7SK-1S2KyjZ^A{gbvd! zmFOcKU(b40NN$b)2BtX~EKTLgj`1=>e6;VMrZ>Uan(Z)q$j=jS@{Lhk=8l{{H;=?W z;oRtR<6&t@`qDLknK;xMB;ISI)QVu0?CmD=6$Scu+yV5vni7l)n=P-kGjoau3Y3=Q z4&3k!>0RjN#YQM`P^&F5zj`QU+eFvb`qd09#&f4m?uAMm=k$Ndv&}wbP{&j7R0KWd z)E{a(GV)~d>vS=`bi4aV21)WTg?%ge^Y_qe*Fap8ax2GSLz*E5Ga`X+kzw2ndfHK> z8$igtXQH`(D;SO4XLJfK#(>j9-;VFdGVR_i$-<_?w(V%kahg$HDH!v1#x}sQ_1FIZ zFiqEBin7X;`koSY7$0?~Jk}p2oWwR|VvOO0o1oLxM#!hQg@@<$? zB(8J=;|ehU2UsYJLgDwo>F>3s>0aiJ*q)W!7w-7xTZ1HGt}ZHGA4t@SC#4v(9%w8; zf}sE~ZL;93zqvT^N$h3A8?=>zBG5n-nb0NZkG-)L-6qO2xvX5c^oIB~jlQcgvoF=u zD0Q+j4#@(;k$7_3lHxnPWbT37d@dPRaqQS3RGf1T!;F+nfr@ZPDX#?QLgW? zPtvGX%zvclC^8V_XK5WfI1?a>91~6KvO=l)mV&J&dB>GqTzmv?i_#Pyqcz}LQqlHn z9Z|awUx9>&oZq#_PJfdYziKM}Ec*J22EpE>918Y#71n3h!|&KfWA5QY&PNE^d^-O0 z&?Hw-J`(-!7vlHLrXR*<5&%y}{WLi>mv?7Eb_Ro5WsI)*hv#!+rC{~T78K= zyLsRiv{+2&d0~^M;&(<_SM9=qwAM%qnvd3|H{HH>2yqORvVW0FV^;7jiBU@Du166w zE_^cZ*Q6_>+md^8Ev}PXxH;Htql$8Wv7-KA2h;CJJym8S->9CtYcpu|x4tStHpWy~ z5)k*8{?=lX=9RhJzMV>?Wh=09z(Bi|^zLIG-3XDFkpN4gz&UJ8J6NlrgmICoHT&c$ z%EZTX%V7F-^D67=05nzgo(L4&8;OZ};Pf1+{*~-}Y&@d`Cd#y0^6jeR(ty!X%8|>s zM}oHd5swhP0`&Dpv5cR|C;3A!TFgy*81QktwJhfoPq;e1@Ib?2fR?H3z1O%IRWf~= z{=OGA1pOfB1`~fWq?g-bFyITvG~!?L(p0^v72PexfFuqa_2h$fJ_n}s_kPF=nYN)* z9fy5crtN`hAEw2x-M+7q3KIV)o7LcIl6FdhL>we5ikp)`6@l*Xx>DJ(_wa>kz|Wv+ z$X|mAI-i)v&n6{RUxWQncB+l&_I&@Eo--ch7o@y4pA&{et$_(Dw-SmE1#P5It9Yrx zOz(0me)W;08@kClwq#$yqF0qgdCJ&IHv{%2vRII85B}g_BybYvYu^h5H}L87HvA`* z)fPteb@KJiVxOjzzmaGD-TIv5Npod_PPK{qO4!e(Cr`06H&eDc!=GR-CjstnodKiP z=@L|LH^p1lIhTA(LD_nV1i7jgKYh#F)zL5c3b?{ea+APo-Infz>kw@tT9`x%>E-mf9-_dfwoxqN7U;<&;yT>92cdWZB40NJVNjhIJ0_qSHqYZU~NcYAan`E)&bS-lpbG zDB}@`q*NGx{i;j}z(jB;SbR07;K0}WA~fZzcwj`=*zZOvtljVApEBAQmL1O%NKjcc zvMQ3OylJwvlT_mgI)QOt`XL8ikTIx1$*Iz@8E1J6*St{h{9s0auAn z=IQZ-E-IH5d+GBCRZe%lkoaOk+Jtlzuz`C!*eO~y->{pmelc`^cgOmdx!$}~{Ju$N zm~BRb2hwg(z#P#=76_NqeE5zjERU&Gz4oHf9ve&D(UUHXSaCOw&;q?yBwn4yQCo{7}mAUwf(@AU-@z4%c>Cg-+{}Km{-?WP&vs2DCQV6M_OGTZtFKtU2mHD1+3_~d(DQ2$!})!g z(wJuOaMo0UcrCbheeZat&_7ZpQg^m6N8y{Dvv!U35+pUyGjvP}r;ae$*erS3t5}KP z!Ko6hOojo>pm`1BRJkN=KKSjXC`foNN+GvsWyC|+cJ#XRodT&kDdTjuk=p9}!z)ew z@$IdL%zMIIm4oX5jJ4pSIm9>{Vh6$I_9$FVgtUinKGq+MFanMx1vD0pvV!#0Jww#= zKsm0R05CZdhmr#cKW(KA$EAov=u>||zSdvz7j~G4dgx9T&^9lTY8(D1Gb?!_A(hdu zB$y2Oxz7@_$1CJQJ{z82mTMuoyF;z*Tt z*^cm9L`1!W@&`I&`8e=6+=a3c0&V!eb@h+ROFmt zs0dXosA*-sFUMxp?WQM#=ADnF^~T;;wp@hyGZW3o)~g`oOve|>>xO~5znY4RG}V$A zL2Hv+g!$7h#c>y*v2p3m7C4c~Q!wNMg#Z!jP4&@mrCa|adn;+juC zT8{>Tw3YGlzPVUHje}1m2)KDjxuzd+(Ci#v^2RMK2X_TOCLHN5t@}kRrQ{m(;}>>u zPx&bJG5fLCd<|>6q$>TE*=qOZG&^Z0l>gxen6}(O^vP`3f#3Vi*36k9Kv-avtoUQ< zd0{rv*n}xYVE^{>h^q5X729a$8cWo%e^o=}noD_pR($?kbaw5%mfy16c#d_3i_OkbwpSPFlvChY05e!yiWD}KLB{M_30y}KloJZ*Fr~c6rQlFMitfc zfqsV?CRzhuojVEbDt}tC$(<_3a`_9QcXWT0kTHLfcJ&H^f6uvxaYMGol1mj>`js>m zL^x>?-9lJM@&g->UWtoD-pw>mD5419Te7A72Mb6@-*i0YXc6@Y^uNkxnWIJAR%gK! z9m@icQ*!=BiLJk<-7^^)-*)gNSZ&AGv5<9ZWGUDRup` z0HeiULCC>&?EDOy@zu*)B8~OwwcpHpFt!yoh}t^#r97k8N87~@T(`e*i0l~a6%_yu zv+Eu))1j%*Dpt%q#FX2*-qgP_o;pteEop+m1ktFGtklsT#CQ(=~5EPQxitPc(1 zvcLhH`=^%FQFhgeNme{F{pYC-I{H!i1VKNSxs9r`#%t*$t4hxkjDXDYc*ZxCZZ<>} zZ_lEh8+CCz*YcW>W&US)b(Xb^$jF)!%CKY7i%mbcIrE%qtV}|ao z{tv*XSv=^rf)QXIIXF;oL1~W*8X1aqN^m~73oX^Zv46U}e5aG`-YiyWU2pn@Dhyy< zAt4FEf#InU!MReVCJPoxKzr4NM4z>^rTYy)-ON5T{gPWNVS2u>Fe2S>QQ-5G6ZL(8 zv5@_79?uq|Tzp4Z8Xde3 z`{GlP+b3PyI!n(}C0Z^90|7)_>YI6m0ov}S9fX6`~8&n zt=EpLEbfXU(*@4$r4Mux`MW8jt11=?T6!8qA5A?tXn4ZI<1B6F_P<4z>;dd9s>a|6 z8z0dd-s@y*i$k60TQ9SD{psvhpkd58XnDWRA|jMlKb~%A?6fQNOrKS(%61ZBYk@8A z-03*U+LRvk#x(rKK;kF6+i|q%POtlD}Xg{DtOaiw$3vtZ4eKR4JM|D zvLIQAP>?djSP}#UKS#UM+O1tmWQrtvDvo;v26L3kU|p!38PSi9 z?k7ltZq+D8`l(?c!16tmYft1~#OjL%YcIDvqhD#mT4d{wdWZAQd%k$w^nD;YsMk5{ z+uOS@tAh#V!5m18*D&f$LtIWFs3*ysVJn`Zw*%1L8f6BuP;M$$*#q+*D*rnVO}!NU zzNl&w!M%%!AGK{+xn5NHLYTm#j!_W{nSmTe;Awlf{^x89S4_v4n8#Tr>|hCz?6|jU zZpyr7(nQCqNy8YZ7n3PDULDab%M}+g(N)F%kY?c4#e_=*e2A_p8k;#{j-0+9toPD| zwxyRzFsE|?t;j)tiY3Lh>pV(7gV%47oXt#cmQPzc8?Heu}^v0QIvlbFpGc15?5{**)4LUAH}A z?J}DrqNEwPDstaZBj3bGzvB=a>Q^r8QtSNR0WQL`@wA8y zyFHQU@HUYu|C-+3C`=n7;DVGQ4EvdkDFQ%M`ND3|=JXS9)*B*K8tk_;e~yw5E&H*> zqTC2f?7yOFdyC|~zrAW7QUCMwSl1e37JvJi?8#PczmHYnlFF{3((9fhuR7#jPXfu( z0dmFcAZ?QV({c%rt1QAJ&Z>TC{a<(?A!4JIL$bH8=+;0jug_-uVg_XO($uyLU90!l zJ7Jrla8#n0;=**j1AaYd>Xo@^oJ~H_;Du?sa2^@gGN^)u3YALT|Gbo|+mcGP2_`|} zRSCT`(? zs8poJ#%>;2YTL_?*d&Bt?xs*s1wCIRBi=C+P9q7GiIccPqC-xg46!s zX6%Nw#W8Kbo^~(=@>4a<)VsPE zvQYaiK;&hA2MGOa$G;KL(v#pRKnP87KbMl9+4y@>J(!CTiv^>xWTx^=gD zy-H=%ZvhWbgv!;?@n^9uAj-s`c+Vy$N|T5&0ch*atPTZWWT=Lb>XMd5Hf;-Z3udUf|($-QL&t-HVRjlV7uM_14Hp zPCpOp#?r@TaMutykg_;!cmejK(g>jyhzrbnRmb!4cdtslW&nIwGsYd?6S61h# z3IiBcIO#=2mnd=bn7D1J=~D7w!a%wZU#hQ|i$V9Tew7n*ibjJn0Q7+n`Z<8NVx56h z&&Z|nqKvbPBQ0F!-!jp4mH(M?;t6;i69RLVF}8H{8S!$cf@S4WFiU&-MyS7&AXuU} zSm|p|by;r^$3NZvvrn?3UNE%C2_5P2$vT4QVA$UKdp#aLkL21vT7=ioX48uK0M$dq z8(u4KjN?yjI>KU8=Ql3LA?c1eM(C&1E2{1Et6uRVwi#dS;;OQ>4~h#Wty=wYVxbhZ>)s^TL1}$f!53YFU(>-_Z1bq_JCxt?#LfEG z0)3L*i(LPgX}(}wY%kJ2Y}1m~eeZhD_|D@SWWzCJp^o0@YCSd9vOi>~-z?$E1?_x1 z1_s6cTK6jl|IfaHvFFW79G)J!(`qEB{P>R$-RFuPQ|fpB}QwqMrPE2_`z zF|tYLaCG2jy$^iA72%jkdR@lE;Sb-a`~gLglMju%z+Bg%rE!>C7EhUw|G+Cu*ef%Hx5dD6-%YBEfM<4J@uum!L#tEl;I2EXW(qr-a?kiXzF<-B zt=_bac7uciHAqckZ^V#d^o$|YSGF_ZNxL~w%s7ONC93-$%wYjPrAt!C0P*UVRXyT$ z%9R!Jg=%4{plY1k-TREeY2cK_l^s$DkFQWgnFiF7lC;(yI7KFIN%#4hq91s6`U)pN z?BPc+1#vTshrdstTlqVwbNDO9DJCF4+EoP%YA6-S#jf-qZ{5Q@TaUXsZ1f4nd~N}J6KyL zCZC0apQR-ZfNQ(JZ!!3=oYuatTS*7K+emmq#cP+&_;;RbZv{@&8N}D8FK%Bk(y2mj6}@UyHFmx zPtO`BKT+AyFi+iKe5K{JWhVCQ#1BudG*?1NBs+v9*hB z|BEKmZxE?VqP+$vp=Z;ru4h(+{p2mx_|Po1<4Z)~2u~}9AJYKtEch6g7_{2}8^l@J zmWRF_5p!=1!)w!##ux-tur5Nj{;()Ee>13YbjHhe523_ts;H{yLtD%sWZ9jE*_06u z6`@#2S41Z{-}Zhp-IDM)o1;Z$t{PsrXglZ*%+Y1{hV^DQ1E738t(?m-aBMF!byC_Z zNVZqUbCkFEBm89|o2Zr=o3?C`gl~h8;f2DAdaOfR!%F`m3@a~b z*-z^p@?VW#2tLJUN>zLfVuR0Sx7j5PT^6eJ!4!9NTvV5LFYgD!tRtKl!9cpHIUBoq zfpEl@5x}~@N6|VK`W&xK)**%eLh_-kC-}Mjl>bOSxnf<0+mY79RsQwfjBI^ z@+AF5u=gUaiQ6}lnXv}Zg}81+J%)BdDC#11qPW_1AoEU}iY?Ad3xW-_%I7|}1_n*p zY%{uZ@+&ZXVOuJ~8mGmlIWip{!^~N@b5Y>W&M7oYt(XX*rjN808$m#yP*#pUmz{%J zia{!qE3Ys3_pfTW|DE&YAt2r{(M-7|VB>D@jN$GZ5(uj<#vL4wV#&X~m%Oa>qc@yDY0nmoU(MhISIu6vR08l1BPcHc z>m<|gkQQr(Q7}=~rLbAp+MBWnb<*mhl+-=8SZVm%t;p4UF82aO_5>~BUaIvi%I{sn zcdHj=J-~Csj*=FP0M|L}##W?2EUp6^iJ+jOsbmu{zGwP2I>-t+V0aQfBNMhGkI%-Ef1z3WTloHDu^3kRjR#C3 zNGo)`ZhXypu9BO=g5#KbP$HVD#=@Q1r(AR+QuugyQi=8}KkEzJR`@ZNy`BbBNN zE@5&D{fo^6xF_=nzry8-e4H{UX%Q|aeArkHG{|`TJ1z{xx~D9_NYcJIGIs2?tFu{! zgx1Ha1}U2~&rlWqDks@6QosXk>w0mYaA0FaYjf@@Hl{?@<@Ds5O;R-bb7W0Z=W;a@ z?hLFs>ri;Q2OvO2%Jd3N))$nM?oHaX)d!Oa(jTLwtWQ6Jc_+@j3x5N6sUr^^-&7Nl zkSJ;fO~od5ahL(A|RANw5gG%bOIHdjMcBHm3He1<5nUay66sSO>#8 zX^O^_oVs=ewzG^x;@-%!DWb1HtGCP)!=T}Q5hc&=8Uc*PC{6caFHM(o&=|M4@AZ(3 z%b6WFjD$M}9X0BG@8Q#l5_l&9% z@J!dfVuAOTl!)JW98Y`3zeQPV#VIA=4fip33MwkSVhvrZoI?y+J9q&Ysb*I)9H~!7 zCpex6hc_xu4G7|JC;X{uX&_~L!ksKmKkOO+?NL*Bgp&IY+fA|6lRM&mtt}z+eVD|o z6(qb$zfoD%N}Ax33gPe6GmgfXO&YW)=NO4_!|R610gE26)wMq@OcIVc5DJ;+YTQ_6 zFojT^c^!6U5;4YamG?d?r(A-b9Yqx?#+esfE0)Hl;fX{p_wfO^d1M7Gb5(0zcAn6K zuL<`)Wdp}+TtZ{w`s2-?RoVUD2!4C0`i_Uwkj{1Te*lL;c)kOt2am0Lt@Dzk^cd-1 zKgV*je%F}B3fRn~j{g89d-kH+SEegk`diS#iR!)=1o&r7#sM)7zf)EGP;@)Fw3|I` z1HAM90HUiY!H_BLI&gc`-VtS!!unCc$b^40QFyn(w%#z);(~b^37~&A-r^t&MEJ%= zYn>eq=QrXzSagqzJ`_51OAW;K^2czIF3?bP>Fv#44!tY2Tc4KzwZYHh ziudc%Rz7ze1A=RMuIe^0qV+nThU0avrnuxu7{~qfT>k*Z4KXL1!fz_#&OJ~W$?T;V zcKX)m!$u}OO@G^u=I{Jf)9cqR(Gf;sD6RpXp5isoPMVTkX~{{X74JJ^XUqvsD1M%MoT zwKktAb=xkR5|9u3E&c+&hPdVc-Ter~eC6XgRDRT&042~hl7{Jn`=`Zy6LT-_MtILP z(^Y%1W)z;LpMl^0C+Y5upUS;96T2B54S8RIr6*oR>Pnmsz}KnAxO2A^%8rJtPQ`fn zdG@A-4hBijp`qN6a4<$HF!*dT9Q6d#87o8scOQ)=&_AU~xVYw`W+NjU8Xd>E44*h4 z_OB=SmNx4n8N)_D4tv+EN(SCI9@XW)6qjzL0V5ltWBD~W-=QyK;jfN(kH`9{A9TSP zZ?BeX^n1go4uxRBepj}P`~A^hoPQma$BuPEhvpC=1-pEvzeYSPe9sPPWDr@cW9ifG zitMTUIGj+{Y|{z2D-x#$r$=IkcR2j&AsFw@Jv&r^mH1FIj-Iv5b^4LvmuU4bsgkf zh?X5|$38g7Zm+bPH3u`_K)A;re--Qq#{(Q!kNiW3-uzMU#irx6=UE4!D(Zj6t!pGg zdaVzpAcR}Qv7U*>ewCM__?t}DwJl20(n9x^QV8w`mRD&bj!5UHYS)#9=?Et|Z`9Tv zf#J9`JIzw4!a>~Q9T7_D-aL0T-953(+r)xIjS3qj2vRR7RLm>CREnQ zI&H=~t}$Lg@M?eUFOGNYS3XoR43DF6`Wp3*5Gt;hJ7*amkEivoApM=UPw|6ZnU~8T zgy82PcZ!FsS#+Y^RDE~V06w4LTqlEVW79lYuW7D;5*GF{zK(uu{x#eAfCGb`dR8>L z3^I6j(hPylhEVqPZK9OAkpYq6RVUX zBR;g!T_HQLNTM|Xwx4-j8~O>BDYy}iP-XH*KTw51yA&^P4R)oi!<~fboJoZn0yf= zPXzKDf5hVIMm@gvKc!_-&J5cQ+N<(Dw6<-rDxLz2ROU2Lq9e zdsZuBXSq3LJx}3^LQXiSOYS)BOXlqa9+VU=a!+$nxyZ#gcqgtZH+(lI9+ZUJMmLI6 z7MAKb+({<6-J3zpZg`!yHMC^>!AU=u{{RZcZawo|5cqXDC#;#y_{5dbr62770F74t zmm&+K_`iemYb*{upoXOJ#EhCO)83G%VmLnaCeecxX=ApZd5MgIT_{VbJ+#>qV^^Dp9aiM})4 zuxy|0kTL%NZC1MQuF`&oHCuB$d|$5wu)Kp$zGb*qxqzk|E)FyJ ze!jKn23@3KkJphyxPHGk)S6dCSZQv6RxgSet+Z-0f^%D+C{PLH)*p&+u*F523G8yR z<&@-Siuvc_C9m2(CrDAkAF@e}!;Az5zK4?mIL>S5?;fWA0ErW@JuK$=Py3a<2Wg|u zsj_}&+8?t>W%wW9&D;T|$M5T2qOu2Es30wQm+ag_d=Btf9rWn`0Ihn2B~X&U?L20% zm&DGUI2tV3iT zykivT@}n#OR>pUAr5`XMkQ|;xO_U(Cyto~@A4)C-a=9!>#!nbME0*|>cX%&e;|umV zdY|?W{{UXPYk=y(ht3K6y@hi>62|WXYidUZ&POd9%po(DXfS4K19kD(ZEfciH|WnC)B zdPKjV?W_PCQ)Yd~3Oeyr<+v&_oF3I8 zTmu^X-1n-vD6y3aF`9APjt?TLnZ%56IH&FkxgCAYE9zB5QzED8R<~F9mm#~T(SU2 z%`mZV%+Eb(L-~N<;~lD}nXyj?J+V($ZU`7X=>qIb2`8pFuOrs}PZVm3yn!+PLcMKC zC!C%u$o2U)c(YW%8+`MD`DU&fku{}{82HLOzl*;Nlw4k-GQ$@H%@_*CU} zE9k-d@q_ti{A<$VlL~ia8p7?Jg8kfk(+MP#(9mQj8Rry*hkhwo805+I;-n-I$i{i7 znnYC#y9Ssf>6YzPuoB7uU^B?CCHRI!ek~Y0v|+Q3)#_ewcSDTx$*(W?nBaJ#G8Y(x z4r!;ZqL#{il3AF$Bc+ilM#yrsBScxNOIstPd6Q=fsBp0E~(7n{FT&7v=u| zwr866`N_lafs`|N$4RWS-4t_rhYM+}2pRFO8e9fTX`cqxG1aa$3O_GM|=~3XY$fo(q08`e2`EEK; zJx8zwKML~SiwTWF&4D;*TmJw;HR;Ap%15Pnx5c#{Wr+$&@|b--V^p^jJ{kD%$~=8~ z2qnJH5FLR#TE9cQ9E#o+(T`2`aS_jLqQ5)7J{LYWyU66*Ml+6sYgg!hf*bxR9Sf)Y zc*Jq_L0xq}hZBY$6E@d@)SU2Wi>YNfJt%*a05SzW-IWIbA6!={*}mdNj1MFbKs26F z^c3b|7>)qX#%rl$7ZIzg0(#_B zTIiOosu>F&=dE~u#H~VmFN%5v%sW)Z7=n2j+_ml~o?7xauMYU1ZqoScNpPi=S&z5g zTBY$^6SR{(_RGf+PYN`kg50nJ9Myy43q!)^Bdu^2akD@VIU_i!TFy_r0jN=I=#-uG zJCowuWA{lWq+b?WAMYPp;L_SfW3YY|D7JRN=RU@cTN%2CY}3KPwM<;!@a_`FZ1-bZ|CF!S;HV(?%`JM1oxRSo((e{=O)kw%|b^ZLbgb4^Im@h_SllarW;U-3Wl_&A8Ss{Fp{b^G^VNI>|#}w>^?HSd7!c7xN zyUQewm^C~;Ey>2rXVhmE$t(<~jPp}q#(3*a-Nnq!>zMw~rcCZ;cR9ZqkNA^HbB-_v;fnJA0E8-EOJ@Y_H@7d5>*kSOo#S~* z=#m1(ILL3n*8%WO)xY5jw4D6LR+NVI%dyYvSyf)^HK5l!^gVvd#dnr=$r?6xj1An> z!^W3~A(;obTEdPE>CS%&QDu;GnyAM?IXj!b@R(fe`{M)Jf#Vy7IavVwD-2mS4|;TV zU~}Ko6!{kDo_39Q@lC^qQuxnt)~g+ASsekD_&FJBs4NL$=Z|Uykzap$T%CiS=C9ig z(K0)hW5+a(#gC^IO3{oDh8%XyUjxiSY1+ieU7VkfWCKWXyKfjL@IT{PKeEsKli8*6 znl+bDm4@Mtii`T=HJRg1U}yB~q}@I&DTHlHoAx|3iE6mf+;J;4;EFLz;6 zUis-6$0r!|6!N>s1aaD!gRvDhMl;-2TkLkBvEUL1YFyx)P{Sk<*V2GCp8o)qNl1Sf z8SCv%U|EKGQx7gV6#TX@cqG*jt~7u~G5-MSr7SQwBNQoM!!+WfX)DO49W@%Qj!5A4 zsggb91t62rM_P;(Cm{5s0EZ3s@=Y2irzfUMKk{vr?NC5CXE5ZC-AD{6u=^8TNY4g6| zdSM6n*S=hhi0#fzeEabaUT+V0;^Oq86?$=%AN5&pBGnpJ#r}NC&|0 z1@qHSKsom{>I_RqvjiwP&3SL^zxBaec0n2J5r3Jj&n*FGv&Gt z)Bv!tW^A4_)b^<`s!3u>_Tr)-5?Est^>%U8=b*@;!V#_vlZ#0@A8P94m8K^H2nSqO9q|%Uz75twf~;+yoO>E^ z)=I`xe(OF6@B-uGmWIl>2HIoK(2DwD6we|k9r}v--@=w&N5=gm5?#fN?n&v_0=}8i z?RS-Yaa-coHAQa3;a~2xJtxARIfBzjj@wd+_e7ylQxA=kce93W6HrIUT7R#=ailhPcntyujPJ<6*@(Kz8&XdQLzE8uL|OE<(PQsb=hlX$PL>soy|S<0BzYQ&yF0aNb+Zp9nBjv?a zUwX)zI$fix@JEQ}@a4NhEMj|C!2_WNx@P#1r8p|uY~jDX<`3|$Ez=lKJ9MZX+~vJL92((GqaHE%(>}<@jCZ4w{YmF% zc>e$p^qDZi#%1-)i~bb}_=RMovRKH&rVB2Am2pDRzF<_ESnZo9AmW7!>2ayEub;<_ zG!C}b%L!n4ZgF0Dd?fzRk>n+sLz2h2t*GJHG1Q-0qpDgk0k91<8+9g4z0Vl<+~9me z_-O3AhnsT0j#9mH>F}%x=t%r)#y%`-Yd^&w1nEUk`7ui~9<9qJKAf$4LO|CNV;hF! z&*N7$qGVI}jV}i34Wnv{bYm|OQj7t{L9az`7wCJqmRP^pbte_)%LmzEz#P?fjJq*8 zB#!l(jm_Mxq3JK1N~54=l#R}HSbe4QLujxO7LHZ@Rs=L;aMEu3vxpJIM3@|^BTP80XZ$6 zJu6zT-HD7oBF~3++Gh`1)6Jg>QNN7zZb#Zl`YEq4Hg4Ss$Gu1PM+Y3^)}J8x&rd!z(N`)i8Ju(* zPAh@ONzqL!5FC z$}6&e!->rsb2FnYkO0Bvq!F@%gN*jYMyv9Tz%OoURmyU#PC90}j=PBQ?p5a}q4lPD zL*Mc>BjubDz!Oc_{{ZvQ)S$8Qt6G3KBc9c%qulun5za+%L*ibDOMd;&pz_Xtoh)Az zG%^WUW?}6KthHS~0MQVf z0F@a)_vXBh$G;V=Y;`?8duNXE#GYh<8+O&*&qLQ0qKv1cQJS1%B-=gnPqrciAahz# zL4W}j%J_HUSB15mF5cn|UfMFln5L0Y*V_cYbW899wrr zn%f0EK4U?)=Kx};j~r+uXZu#zB(aiTH)#+yFHw zx#JDR1L7`&6o9Uy7uN@xN!gE;$m;cbe=5>;1P_;~uR8FZwsn0~&qj3qwWH!Mikdvy zdqD-_Fe47#CY4sHPI_NsA^8OP;QduUsaV{BXC@y2P! z*9Ue1HIBa!JUr(ERJXw$caQO>4;<(y2s)e}gNiwjtooX*YDxtotugIMIO$Xek2Ds- ze`&#<_;LO;zwnyqJ2G`BFguqNHntUuvBc0w9WXIn1)=**z8HHZ~rMbi#}c|E<%PPXutSKoro+aHy9-|YSIpHI^SdN z$tl6OtD`tdF{!K6`hEy-dm6AH1aNX|0X%!**$Vl3rL*Uz*#Q-4Jb&T*l{%fc!0g@q zD=upq^4!)Ipn7NNN-eN^W8Sgf$NCy$8iXgFNjRxTkF*209ZC%K9Ez@MiK9rt^J5f- z+Z_naWYY_0I?L?Gue z7CHX_eE$ITt2g3*#tjxr8RU-c2MUelN4#!!AdZ>NE6Dx`e$Y_(D@%*R`s@w%NZpJx zjFO<9pGwuzl;O=4v5h%KGivA7O934QDZ(-d$l|=RU)n>$$fT{xzBtbD%~OBcTf@8C z_t1bk29x|M5|Zd?D=k^<2Z4e*(&2WDU=dz97wr$F-w+{t73cWwLX3VUqnG35yU1gL zJ82zrosyUQh^MaBBI~0)sAFm5RD2LlYsgpQMA--XJ1LBo+Wb^EUmjw!i5}t$WL5#n ziH_wSs#TT0TJTT!Y3&_j%flBPguK&Y{i(b?<^WODpURF& z+u<5$^sk9Bq!32#-zPuHyH9{~ML)xBGU6lqtBEI(Na#VC>*b$_UmoqeO>OplDmS>e zaAJliRKDVI?bn`yzO?usq1|X73H&W#dlNx<6`1p*ZVItxWBlr887SSN={;SJ_#BR$ z`_n-0gPx#gtvNU|y<1q7Z!=}rtb_9MSF^Mn4| zo(SNzmZ(Ah0HyP0}ktWva0qSM1|) z9-wZjRHyu}?qTgA-5)|uGORjqYx3vDKfU;(m?ICVp4=baj91mV_wCc+c{H22G>ta= z>JJ%6+TtRL2_18q`4d&tCzDvQ)}0zvj^QPgu5tIl=kOKThNU>R+Of%2qyJ$F6H9Me&w}s_Bs2Tk6(f9ApV5RA6z)Aez2BL8W80oAMl_PUS%0E(x~*lb-9 zg&YsUny5^>xft}SGkC8^Mj!DvvFFm}KmID1JXfNH+;w{%yyEIV{wkH7wkd1W=$%ZE zdjZC4&HpHY$w zfjfM>WZ(b?@~*rxe8(mtI%s{b`zycvSRVwodRYOt{se2*Jk7gE;NzjMg8l%0)=%(< z!BBW##Ci?Q>{c>A+2@5DC0K$N91c0}-`c%SFWc|IlQ=SH+N@{3E&l-fDw?#abGD+{ z(@vy$cRr%?{$HDx>;(-V#^)m=wS2(8x37WNF8wE4L*M-rfAN3Pp5M2Zft@yuGg&_W z0A>FG?5i(jQGJ*98!5-R^w4m_KGev|@B4(Q?_W4se%sy;)M8@}nW`a951A6D<(8?_ z_Ra9*?2i_icvNw;lo|g3$EtZIw~G^;d!I(A5#*8yJ-Xta9X7EUV~h&<&R^Rv!|}g5 zRmu`FN;(if@#(;ikPumm0+McUtV|{W-yW%89PgW8;JiO-;>4;ARmyZ$DYVTW(DFZj|Q6lkL(`&QH6 zGbqRFPncF#4HP8epuvI zC-OAZ-Ne<80r-`0vix%RdkQdThR*CVj!Kf_phupUx|Jh)^zADAl2;=WI)AanN+SudJ|ezi;7Zabegj@BCPLSmE=~;>6Uk~|*I=z8W-|Y$hG{5khczvCe>lQ?SGq!a<*0JVBhNs#052YZt z!TY%$wVVF{3D<{|05yvM|V(7R1;oypM+kiOhR6pS~ z(2xAY?Y*%mIiPsoKyk*YZOH!so`Z^9=yoS-f14+*HfwJ>EMuP4S-fGP6aN4qJ5$>N zP-z>+8a!%oc@(YJY)l;fK-1oK#@irZU>|CW{t_)7QU3rTJ5C4u_d)$>4~g`V!PIRAKk4B=_^N!} zg`p_6!Ok&A(E-=LYJ~WkM^JOB*^)DWCqw;eANWdiM!`CrnBzR$AP4oQ%$W2hmLS8Y zPSsXRKQ=bV?ZqSbw?oIvs@W0$0AC6D^{UriHqdRLXMI}90QH@J#*S?VWOzTsm_mGU z@Y-oBmi z-^E`J>pEOge`#CW%FB}+vMQg$n%bmXV3~v(=6anpxnqvi5r`918^(GOLrk!8!S~=rDb@FrKr8^9+Ay>cCF5;bu9iADpAjtwT${q?1qIU!&ejC&r{Cz};L z5mr7{xA-gIY0JkIim?QSSni)I_yfgFAHYusmD1@XJ(#L9i07q z@ZvVlPQCipR+r+PM%z|{PZ3S4Te-tt1i?|BrGUr(09vq9dnRq{;>_7UXWs+d6Xs~_ z`2Hy_WPj#pAG4=`Ml+!+A5k*_`B$Z=45uxRYE)bf3B_8gIIS4HlzSd#KWA?M!a<8c z^2qd^hwD|_;4g&iE>>7zt1&Pw7pFqF7vzZj1Dtm^M9{#oOXvE;| z;-b_f{{TaqEwpWKdwegjA^YkJi)(bZvpPubnAmBUBB8het&y3KkUum8Bpg-yXUX`OlJQ88Z}=GHkvGD zoM@9>^0C+wB*^^_`D-$m{< z2`dLs{ggZxZ#FTg0D6C>H}w_tB!>)7psYP|Ox&uTfM+!0TBGXB=SmP)vEm2zRq&Zm z5^YTvu=`=a{VU3TFMiJVo(Q#FOG3Z7y0Rqsmc`r5Pki^UuOX9;y{nt}fZMc57r6v} zhP72^2YcM-oD`#Ed~fix;dY_%3jN)#r?<0=g)AMnyAk(S_2#~i(m!L35?f?@?Q2yo zMs}sv&_6>*z#9~XZ9YFOP?wTY7q|Jvd#{UbZtVO!aV3Jexlo`8hF=*O+C6ccR&&Ho za(2+{jVMBz(^JM%_A~IB9m%U}N>3R}%zx~(_Wg|fDBS-5Z0q?wNxdBZ0OPgUKDBwL zcyjvY&sMp@k`(7yQYimm#|41fUFoXEC=}hbspBD-a=HO z^|9sc`xN*#SoWPqT5NVVfam`J9Ht-GgTW8h>sS8(z_ma7C3*}VBG;PpT9e8B%vyvt zw(5>JMj#)T*OB>}^r!)7(U=8dqaYp!6nlD+)0n4D64#gVK75PzFYt}I9#*TaMmk|{ zK>q;QX8g%hr=uNLk8 zo&NyX(~sJGUquB66`xbmX#teF%52m2s;X(b2 zejbMauBO=TZ`=GU-^y`JIKd=f`c-{ms{2fztJ3O^0-N?O_;_OhQ&9vAVBbApU4F=Z z3ACA)?AnGD@r&mF01En2M+@oCHO}gjnJ-+H81}1$dae9S#-$o@TOU7Oe##yXo)H?Y z{Cjh?zSdZe%vXT?Q}{Kgd@R0mZ+O#bjyK0X4&?SEeJk%7A@fI}9qYrtX>g;$I)arA zw$$=_9M@DU)JOat8VIh>@;}q?oz$5bXskv4&b=eGBHTmu>GpU+^`vDyJL)V z#zkxVGKYSrJcULUFf;!E0c_qi}z2Ix6W@|g8Vlnbw zI2?Ko)e3&fz6DXc?01KP2y53h>>gkl9Y>`-Tm|V`dujJE`n^8KjStyNz+;cHUJm~N z@%H?Flz+o2coiHlw!Q@R`(u$_%fB4t=iZvngT^_b)~No|4`B=Jc&+E`tKg#?f;g{L zitv8c)q$sc3efx^CE8f5;(4Pn`O?f;&>rYcHlJ}{LdvrGcgX|$b6<~xuJEOQ;>Bi{qwyq@2}I>qLyx@_06Tg@R6n6{8u zcjCUz-GpLK(AUkvC2x+lP6pssX2v}Mu9{eii8S5LS3xb^{w1*2l1H()TZN6bF;GU+=~U~@^<#7)*z&1=WiJG(ZB^Aaw^DTp z39eIF{g?bLr`=)~)Y3E07tQ_^^n9=K*CXQh+bzC2l{uyDs&tbSsKG1P`SV!)o3!a| zWg2Fqe`|8zGPJiP*CX&B&b+Sgz?$xve)cnXiYRVGo?6D+w=wC!&$u=9+A$=Po~FKK z@w_U(v;~Bi+#caDJ#ZGfaP_CEmbx6XqZZdgv+%dVYfUvGI-SJ#*Tr_Ttc;*@oB(+o zSGIU-;7^92)1x!lG}1TBOUh4Qt#UBPB-L%hWV1>$p1o_{?OY3J#z;Fy@~#-wsVO$( z&e>3>80d~a{uIxIifwH>zx?z+;Z2X=r-UE{qtfulsWKjaO6`Pzl1SuKisz@}TYFjT z*(#h;(Hv*|DSrt`AI+r3K>q-1k@TfM1biIK80jnWj10YYn}{dWQZte_Wd0PLN%sy^ zjv>AacsU&H(c?K7Ah9B_{73Lx!m-EZ$EHTAaIOO%z}Kg|p@n4lf%B$G$MGosRK2A8 zjm0&o;<}H)tpK2Fc%-*Iu`3WO=YNg5Yxq`MEj5Cf%)(Ta4ltk$5$P9) z!EXJ9V*EM`o(1sfkbLW58lTp;Or)vF>DbqwEzd$LLKze!2a%50>s)ulSfzggYsnOb zH)}aUzg?$k!Q;}q3DMaU1pxJ~SI3@go($IGUy@(4NEZW)?Kq-4qG#~4^NoHL>i#Lb zv(s+;OeJaLQ515kGaflBmg2p)!k@FhhO{_fEZT*|(ykgry?Dk?TmX0#=3WTWue867 z{vVd@nWU25X9FB%R=%A_+puSjI(=)q7gA}crgGt_Mp5Qw?}oo;9}LZ0$=e7k$_Nbjgf zf1P?%Jcjy`PvcT5g>3aFy){xxsMRZ$WNOZ(H=@i;sf76N{~#+YSK# z07^I?rFu)YNd#{9sHZ^6Nj!Q}_L6-{_Hk#7c$4;i@Z`4bcWAdr=r=NbskrWI%k^*B z-$2zZ=2$MZJ2~W2<ZL4lhy{gpY%x4JP_+!N% z2yY?Q+eX#AQ1V=hk0voNW-NCAFd4bd;mE~(58)5l*TX&-(jv8*E1Svo4>jbukx;iC z6dng3t$Fvw{{Rh7bNfbkYfxM?O){22&d`i9e_Hx(=mWdAQ~K9dBD9=hk%bCLHtu40 zPxf~3j<&*ibmmwhJOMME$I#^0c|Yv+;5}aCNj`|LDNv=n(mGbx!^X~qAp@T`tyB1e z;v4-g+Q!#Sh|76@IDubj#A6vOcsS!dtAmVEgy59v{9n%=qLe-&w(KDl^x2sIeXLvqRkt1nf+9>=fgUXYQ8QO-cy8JPcI$!oP(BEFD%}c4r_O_^2ID(Ik zRZW*0iN6ZlY)tbDo}E5oCk-0Wxob%nwq!R?&I?C<&E@*kblHi zr)wVoJQuCpL3MLuGEWp@C3|a@gl+4{UZtBAH(?2gJGy` z+&~9YlOR;ke$2lQtsF@emY{@m4XH|N)aA9`Dz_{6Nc!_*_xE1EXyFzh+U- zUiI5L()Mdpo)qCJ*_?g1?A73#W*%Ojcewum)BL~7HR$>;?8)HYvPN!fZdr&0R9;9i z`qk03CsH~V8LwAHQEzN`<}r_6mB-I6=VPY@(DIqTW#0i#Nd$BiKm5SZUjvt?$7(Q zbIA+Y!11>IkURq-fMeBh*CSMxmHz-_e+D=N&8&^26(8Di9+m61TK1o)q|Xi1Opvo9 zv2lPw#a?U6Xu>ni8kgYQQ#&P-A)Y1Sk{6O@@WcZd6bUUKFkc8*(%~Gi) z)J~jF&wq@b3B2&6dVKNjme0&(+y+AA4z>2@!PgJ)ufgoUF*;;fD`$|3No?iF|sNU!;#XP9?29iIQ0gc zR4iM*`(~XR?ob(sUqRZrmZw1*s|*gRIHu#+epNHam0he`J*l5R_i5@gz->GsWp6p2 zUH4LT-8_u{0HLjzn`a8UKo|gH6pz zvX?(EUwT}_wUK5=snK@cQL5_)Jm<8am7>B zq%i5TZefC_`BdBX;C1z?9wwP#(xq$?G1|0~va!teDtsG^Pj#(a0sjCk$`k92wd%@n zIIlGLA(!yY&B4Po_ijt|&jP(DFxi}QS*;P;m69?vyJ%+d4x@B#5@}a#Apqtq43YVo z-DV(Q9zAOg&r?}-ySr#2P>>?DvJMZJa5np#ewC`E5t4Z{i$##?K?Ku5L zc0`Im0B4$&MnLAGTmTI?vFbWf+-P?-6oBBIQ;Xz`3{+E`WdQvRoVvt4@_3{+09gQaHRLgTKW6-qPS%6 z#-bGe0Lu&zeG3Zr_h7jPzk2z@_NEHn9lSU@wxHvlH+Qa>d`RM*@1gXs!U)3rFz|>! zC>l+%$NjQXU6wvxxy^H53}X@eI`FtFjk;a1{{YBKT|des83Q=39S=n-5eUMNI@FH4 zlNlh6IHYwsz{eF7Xu+7ChJuM=B?(nMJ!)j+F(BvpQv!fSFmdZj*hM`t-xO>})+7%2 zJYu9%u;3g6-lL6yj;`4``y{7CQ*X z{WMDZui`^AehJn{7+CI%kdgrUQq{!w5zQ^w*vG4A&mN*^#cd; z9<_|u{wlHY--n{rbt^$q(m%sF}8cA%Bs_w$p?9 zS3lx8#J>{!CYb~*H*P@Z7*IbBwKp_K?xbUYdiKq5eju2gQhss){(`%gVSqv7(!A$b zn|`Np#y)@2sWTd$V>jhV_B?(DzIoEqf5#|5JGQ}a*dCZQ^av`7$2?;-^RI<&jGr7X z3w*&XW($vTpXzIRYf1Vup5FXVqW%^t$>K|bIoSxvJw{r+dCmqv#d$ZvG5-J)eMP#D zB?9{$+}Esa00JB9T(q=DeO2!PZ(g~wWMVj|FGP15R%t`0pp4Ext{ZX~kqi9x=tFETurwVWcJ92(*-Md$4n1(b( z7*!bHUqwVn7*I3NSIt`No4;sVO~(XFfsV%px@i1Q z(VWezquy-(eRk1%w9C)qUh5ke!Y}(H`B#PLaRuCSSF8lLBaCL z&0>5txr#3WX%1NVqIacN-=<%Jxxo;5o^GAh^yl}p=aknNLXuQ$bV3065Bm9cvX7Dbz;+y5X`FtlD zu=%Vd#Ipc-W(TKEoOPjVsvoKAj=wh3*0KCbOj=ZjIr-FnqOIxH&8OJK1Kde>A}9uF zak;*@;e)G;~z*G`?QqYmv+9CaSY=#PQEZwBbY?uE0DKb30-S1hf_Ju_Ke6T;b{09z;7A&>7tlkVhj_ICUWEry*aO^q9n;4 z21eoiE9Nf%v}5Ckhg~ptK{!A6$;Ev(hxgHT%Ypo>qZjc<(8~;xiS%Baq}f}H@)3Fb zD;MHe{{V_YT(B9Q++!c~-a6?)Q}M+EXa^HJ?!z;-8tQEn#~#&>7+sW)x|ra`A}fHqygWOY1KWKxPpZkeY$ z;1iAqH5<8QI3G$&vMX|p*u{;<8TlKh(ASe$NME7A0=-`Fs@hy*{&~0ZHRM)Ib_42a z>Fms>zK6~}KDr6}PicxvGK*Kjso*wx?ig~*^g z&@3kL?~NnzG>T%;^ziW52J1d?nK9|d73rH5P=UY|=YAO0yjs_G_LsgLw6L*72qc2! zuuuT#xc>ke@5G-k)|*xcy$2Q>N6ZKm#sh9~%}5RxIOsZ5DsrW}6W*m*dX=P%84DgT zGm7%x6-p%WMxnIiD}_IhuU2un!5sFlCGnUL__p|{1Tj+C?nvgY8|Xzvba*evyL*W~ zB6t?=CS`^ZC}WNZXHGNtSGhh6e|rZeyg%cdy3MbQyf1lfBYh|jB1LBTw>*oM$FKsu zugo82>C+=4{QWCw-K2BUR&41$9$lcC{1dp1s&U(`c2ms_ly5Be2@GK6ncHqZ8uQNx zBhMw;#lyDFdSk738n%Z9zocDhcZymG;_}$3`M#j~*E!P86UKT=_%Fm7e~TizYq*-_ zZRNMPV#=aU11Df}kH}Z4h{U9v3}cS<=aBdZR=jIV4O3P(x=oy-R6@Trn@`FQ&;i!H z9ySU#jsW0do}xnxK?Vj2o<5acWg9pk@!qYR5Jy^qbObKk2Izh1HjA?|XM~n44h}_e zzYrA1sMwb85j=mqYrS+N{M=U$@gYa{mYsrggIbhPMc6ZL%Wc0|dS%3p!Zb<$Cw!DgG%P*iKuhzYG51&r7z}f_3k>0r) zJ6)N<>lSvg{6#l+LgFB8p-5gg+N{|Gk6zf#CH9EYYC5IT+OxUT;F2a`%dS@~?Tw@S zgIS#p1NSw+bz!hf#T^bwPs@binV9e@fTW zv^SRL!ex=ok z`5MwAjNo(YRdrMcOSx1306g3I8VcxqRr^CL4~F`X9EL0T#WUHr}|d`Y9!ywDS9 zUV72EI0vErbby@T@_mI&5JZYw05RZ-!0K8JL;=q5bJ*0MFZYcwh1lHgDtI2Eq{9CI z&o%t%wmTja%18$oBxHlsRAmBz&MC}!>-y6|gN}1t7P-_a{KFiK3Yt6x$EPC{%qB26 zr30P`r|K8ba*$@^WxCcxyvpac<67;QcEzC$Ax9Axf1 z*J-Zmk!ZR_)!fa6i3u6tWbnBsjhi2Beo(9w9vC!6glbgHNHxir>dFT$}dJli4Zx+WH2BR;Lj^2Z{ zH+JKkQYf2XE$!)2f^op8Rfciiq**X1WhO;(NRCF&MK#F=CRXDdo@=GmUuBHs_ZSt* z@DEzjCna6WD#c3-*OdOyH;rlGNt_-EFe-hbDWc2H~UCjd43j@GZ3!Ppvm=R z&1k+Pj%g#f{gvP`_!iCI0GK1m$6W4e_c6lpUP1ddLbm?^4{XNV4T;;(SFRU3Ybjru z>D2TjtVxDoF~_|~NKuk~vMRnn1a$|}oC2!xpQS@WMTH=a2R^kR&m81b5#Tm?J^86O zsqce8(I+7Ac&P`PhLvtV=9kTAyvlLSscBdE96Dl$4(H8Bq%{u~-&|ihyXbwCb9e`o>ztRX!G+elmq_&AuVpGJ4+Bau14L@Mkr&b19mWRNDds8;(i0JwZ5iX9q|f=H zvTj!38bEf18N!YMs<>R_{w&I2_<650HV4^X2mS(U;va*qv-qD~WWy@Ny!}~CeVy^f z?PK^~uM)*Ui*851ALCyW{1*wExA!YcP zu0I20GGp82U;e#x(szvg4tqao6X~ylgEMN)k-{kd0LQalrnw`vd3V7@A7Rv+CB9%X zeLB~sD+~-^*EKhx=u}scKRF{DRa^UXyt1C&R1F-6$UzzEF-~bpoD5=^vTisy=Crw; zyPj|Gf5ZBmM*jd()AQBG4;^WTf)04}6o4G$8kgo$ zb|jH~#d+_HpMJPkBZM4Ret9+K{xEWULp!M-C<=ceLPm8qDn#3uW3laDGHM`8`$9qp zARB^mPoOpQsuFR42Tp6|-QmAzNOGWoBk}Y`{{RZ>pzNjS&Pi)1p8o)$D^23PJ0(C9 zu4~>0-5)?JzL|G#cDRr!rM<>me%mVoy1AE zoO^yXIL70V^riqoIqOGKGfP5~By0e3KRUzlXZ(VW2mm_d{x!5mKBECXnW z!|PETb#_PSZ-isdhcvy+4lUP_+pTTf1LgD^M@$Y)V|Ww;;e9ZYSpAhcjt^Sbxn=V6 z8Xe=Yu2i}mYhtm5fx+W}my1RmdX&@ON?3(N5e6S=9#c_{HiOepO(o3=V3Q zoV#sc^w>N5RN;$clU#`1*qy#_YH57%qduflJkCWo&H$dGs0Dnv0~w~dINREzHv@6+ zO3XIo8e4%@`9IKZ4(wqV{un>uUO!^o;}{j|_wp&y?)Pzs+n@LeuNSgoxp~MnwKQW> zbLMZ2mWtoB2ZrSXGMVFGqzrKD$K(&0b)Y?+?$%0#H9n?A0(zkz6OjCnrX}PRla!^;2EY zm@9#fz3YVR2aMz8J54_u5M*=Gp_XmDj3ahCa0flW|cO zJQMj*=usmgtegz)^yywp<3LA@Z-X7!3xoJqs+T7lcs`Zn{xxI&011uQY;M|_1L<1B zb2;jdo<2YLrsqcZgW(G#MUu{CZR&cGWC{rSSGy8Y+$J&xMn~4ZbN!{Jdw+>O2$6P$ z3VCl+Dg*t0I{FzLeV-%n&2&^zPU#Lxlm{Q3dPTf=Ja+f5H27&C zUlB@~z-U~YdkXZBcDdYm?Oe7y6D(&3r6?Y~I|_igCpo~N%ei)p=9R#ejzIu`JJU;s z+ITpqSx(#&imkjO3}%I>?n!YVW^5_rrEs4T7@73e!5992c@V>xVmx%*s1AHfzyl#%CwpT%pw_zjf!bE5|P!rWH}`&i+;2WG(oH`<5O zs@HAsD3$nsrGQQZLxc4{;a###(MKGAhMB*nF`krphp6DBrbbRFdM`}T zke@@^m>&zb7&*u^-;nM|QzsyP2B5!>Hdh;n0LJ5=_f1Uaugq#Ip}Nvw!#^W+`cguA zpAvr1#IJyL5P#>Q{Jqc2E7^Z#sZ5^%yfn(WWky1MFzsGF`$C=m1=T{P;v4_~=kKk0 zkL-gZH^BWhS&x>p$hgl>ovW|@UHr~xYo6SWcLY;|>P1c`A=#NhB%F=76v>lpDp=)1 zagMcONraZsq9Q9VR|A&%)&|SWh&JWOAQ8vCN%o)iSMn6tuhV?Kv8i{g0ku&K|f>0FE2Ic^RGN|y3%A&Dlk_Gub9opgRBfs|xp2cBvF z0PvDVcu}9}Tw#R!=hmFDx+Xz6?@N$Mr$fJoQd{^!uL7#i9>*$270l_{gtl@f56hl? zg>}fucL-%Wi5bmp4#>_|+^U%;BD~Mzy~|tpV<xxvx(0Sxz(3yu;&t zxxCV$fiPL6jPifl{{ZV$Nwg)ck45k=iIU61b~cg>m{(vU&{sshDz;|mz*n4UDYD;c zf)o-4dkVN?ZP*#>){;j==I^214-?yU!xQzX2a0XLI0qHy<9_@cf;xdns^pxKJ*Z0T zTd*+cYMxYDpqt zit~RqLx$YjPh&@&Duc<}o;j*AQ@2CYmsYh4xX3y8r$?&V6U^)Qn)2gyJ2p2qDpb3W zZ5xQky)>>K(^J!qsc6R{;WJJC(YEX7t1$GhH#d@o;fWaar592+@i9MI6_$l_v(eX4 zfRFXd&rH$%r)|*OC^hFs@s390kxBNMc`C&FQn5V8qm53}k@kf@Lrz^*(2V)Y0qb6F zE?;OFAou2%?GgsY?mo2nQy)7$3H6(FKP0Mss={kln=)lw`ewY_?J@z^pIVShBAyuX zI~shw$y2fD-`iGTkMxB6{{Z^b<<@Nme|iY7Iupt;3m>Lw{%i0ue>z;Z4`}Xs1@^0N zJ+MeddzL-x3S6V|Ijoy2wvClZ>F--RR#?Lin~K#dBPlk@S4s{~TnyKO{CAQkwVDSg z4a50qxZ~#I82)&n{YMj^0{{XZbH2yL0y|><1)PUQbxd3AyjcpZoW@7YqKF`wN zD`lqzY$SH^u19<#iq|WG2|STh?4$H56V#4*t{1u8Zlhg+&Idm9 zh`T|_=h~HtbH@gU%AdlP<)xspfwyt%nnx;IuN2Tv%e6Oi&T2=9B%4kf(v^c!AVF?A ziWmULBR%NB!8`-fm9~wch#je*(&w1`e>;8{YM2~lI(=*7&w~RxuZW0TDQMUE*Vn(a zYlwap>S2!1S}+Lh^H<3K00Scrd#;{Yyx9K$9u0IoF!C^`{_w7SJ>dO%C^WdOr(qe4 zbv4k9Zo)>|mua5kCpG65u>}|$aoE(Z7%(Wr4&yb;8{0!^$zI2ye{0xoA+F=&+|m83 zW1sl?kK3B_hGUVO=f5=}m4<%s9jV{Bo%KBtbz2jU^tgfa%|H7}&9Z*e9zAnjZmiof z*$1~Y_~vC(^B>Nh`k>}L9(&6%r%$qVl2%+QuRNObOUq_~$T=q&$*n6J)>(kuaC(Aj zZC=nx33cG(^Q(@;N#ApvnSi#Ka&Uz4Uq1XcUEVqI6OeKce=7IgOLTTuJ4gr1JddIO z01EJLhY=O=cZgA&mT1SSfG&XZEg~Kp$+29=WA$M#lpekq|u%d2+bFSKgzu4#CW*Xt}Y`#x{fJDZ-_tM^vo=G2k* z@xjGC#V5>;c^sKAPX@kegJ}5lUkrX}4`23JSJD!efy#nG2e;#2H`#*U9RX9xGB^G@ zYp#p3mHQmC_~Ludhh=5gV3~O_Hu3mZxLWv@(e0DWVy-~Vc_)OeJk9ek8;fy{!n%i2 zsldf>L27yx9g*E15ox1?A^fOKe@`R*Zh7fk2@Y6{(+2e<^Y2c3?;Pq0QbdxDWO_<(}r$9^{sJg^NR8!hLE}K9vty@n?93nFQt1@iUUZk zTFc@;4m)lB)#Dr-@_$P5)ci3)AW7i|`7l)5sQ2@ssdj3@* z@ehYKf5=uMd!B#7ym!lGYyxvgQL;g19@PDxLHkaJuzzoOZ#n+cPKSZv2&i0;-3*|vT2QPrI{spQx5OYewF3c`HoGb02k7> zEu;W#J^gBx?YEaM>>L`jtc>LDe6{hl7H^K;77SD-~bJL@$p{L z%ToC5q{DP&QxX}XX!;gbQ-k=A)84*_hTPmrqpzr~Ydgj!R9>#g>;4++E20_WoeRM^ z3`pvv3|FB|;(raSA-}YC%16wko)4!=^1z}Pg5YNrR#nNya(=bV$#bpF+a9?Oi99bM z%=)UvF`SI@e<~#LCx%rrnwqgBjC1}Kj;pStvQbL&FuzLDel5%nAeQDWd<2!zpUe3YJda&_UhY}LE4=kW(VvavL z@~;zL9ZSR)7lu88R>)s$Vx)#oE&2TF9a12}%w9OEjCpkvmo~@D-?e|6AB=n#G8H5+ zToIr7YNz^F(TgbiI^ghm80lUo@!vv=Uh(gOqmkVP*`xpfK{1fy`B$@P%qFw93JC=V zQPYa(sVmcrPI`YExv}9}w$inTuR?B7m27`>^{-Kv#aa`}rS1e9x!S|0m@;deZ01ERM?aw6V z0+ieC&O7nejz+=Fo|v8{(HZh@0rVpxxSxm`#2U5K0vwoP;ZAziQ$Rw1bBartjIiTw z;yO^`;`IyjBf-CF*!TQ9v%`PO*Fp3Ky3c@@&8T<-Pq~o(@>s(VI%nFs{{Y&6ZTN6E z0#DikfCoZA=CuC+XJA+1-jsl079a+Fai8m5ZT{!xaj)W7^*6{1&sz2W01h~l!@7AL ze4+W~ymD6gfE{ux*E}S_{4rob`Mkb=GhAC9hoQKDZO=neDv+dP6IG)*&N4U{sn-N? z#ULK)KnFhb51mGM1HCY=N2#Zf0`$c@k8!wd#~g|$QueX}GxC}b%nu}E(v{RKEI}X< z)7FHpExMl-e$cye%t&3U)&4xsoq#7cVn z*ci|8ithgaV##E<_(63ZaEp9#$Fm>jn(U6W*~d2?bKlXFp;AdX`@*dGMoox;Sb@o2 zdH1R)#x)t?NyS})@5z6V@s57A&eJ+m5?GlXmDnVTd0MZJdY(xd=25)vZtd$*{hB}T zH|0mDSovWsgBEWrfIFHD0DlcvPZ4P$cO639sO{zoYj}rB$NYao?tH;n^A69kB#^H{ zC@_`UHXeG^EwAZE3~!)5gUkk;z9Z8B*l<4XBnG^@;*X6itkLyCSILTGAd~loK>GLXRNp?4Gtw{K*zWZB z0JT$sxjg2st-6Nf5)EMZU&i_$h;(av%X|1$WKc><;aDH0Yi%{HI}QGyZIS-~O;`MC zFKrp5mEFlru){DEt7*HCIPXX`n->5ZyK*~$GJlOaJz~L+7nb09d8j|F9LWmSLJJ7h ziN;Mo>?0fiGuocIm66Z-UBCVQU-6|~M%ARix`RLU)qlpHFj$0I1R(Q~(ALJAagnjI zdvjU;0ByElN7^Cd{+ciN)8e~@Tri#^-vUK6DJzYw4Lh4~m>_U#=g*9`V^P1;6oUBF zp~{n;!oB+MTeP;YGfOJq1Hf===1+?LEKN7X9vr!OK!t9aM*#2!Qw6<+Zw1dJqH{TN zw0!}k+F=g>4aT&5to0eHdPViM?WA`W^T#|7^DD;Sf(>e&yFny=b3;bKKBv6_=(BPqaGYjDNjH%Af#2C#N*7g<=tD zx89r}RpS^nVF=toU@$Y*mA12GSZ(Q=R|Tf!U$gE9Bk`w*7XuvyPQ?N0Fn#F*s**Af zr2%3kwpQvn6bog~si~EL9albt(@8>4-3RMV!D1wfJ%u_jvY(fNDO+r7l0ZLNhibyd zY@D8WG+xhAS}mk`GJCbVMeZs&I--`KX<3W;ti@puFUizd!HaW?474+=- zlo44xl1j0vp(iJvmGbY4?oWvS0BA1+!vlGQ>QPIx?{FL*-omwmyRjC$k@p3!%N${` zovVxwYPI|zV-*Ag_gyiLne9>`EHY2!TyM|Ek3@%bGGFaf8Qp)nfewU_pYlqLP;F4m8+iT8i1j8 z?VzA%z~FYK`N|GYZu!kWa4b1oeQTL$i+a0&j2!&D4)ot8TW-_s%}iNGLC0D~Wh3Pk zSGbWFfF9hA^y3&G!<^Kt1a0$l1FajEAc8vMB9;4z=td*t5H_0AfsFAKVhB;T}+&!%mo z2@p}+)}}E5h9jDRXN&+CZLFv^Hx|#t^yrc%|~Ug#coj*Gg9; z=N`2nnMls{P(A7C)RHj*h8&(ML2d^iP_D1YV8hfAPfLJuK@EY(2A1R14f0oRaaOFQ zIM_~m3aYa!V+3^TnpB+@Oa|xJ)hz_BQP!Iq{Ap<1GBaHXp@n2JT zi&D0+(I&aLbzO>fs@pgGM&2_N!n3t`rkmY z7M5#)gV&E*)X3aH^{N_u<-GPV$!#)C19Wt7L91yx5_t#THO92u=#$ptwgzB*>8_a` zl!ADP$C!f$yMc;VnkDDVL6eSHb5`2ilpzNhCmzC>$-LtPidVTzpWZJVec?@OxYrn( zE`1~w4%>@R5rt9!=RE}iU$e*?I0BgWF{Xce9&y)rtoiTbX4=l4$8f=@Zp!A1T^Y4- z-)V@PbQ$YkHh$2Vl_fagB!xNaoc{p&>)$Q)n^+P2+2d4EmLyS`I_(_jnMo(*WGz_wqm6E*LyDj zsTeuq6~O#l%6vT6cQO9}P@ZqqG}=9MtQvah*dnsAhSBpG89jQB)AFySw2Li~ zs}Of%t$c&=v&Bno@xsGXvbbcn4dl5U7;hP0^XXq>=(^pWqozSUys@-WAUrtAoN@^E ztEm=}Xv&XK(!so*q;{e^L4lR)SEKSs!I?5WSX0E1WMWwIPxr-Uq-xPb*a9(%U$FqZ zj1$_g2Y`|L`19$!Q z=BHjV!kyTxW=U!C@VxudJ-c}%72E}Aw~}+25M%wJM03D|W<@FKyi#%au*>nRfdcK{O?f*HTAbMHd~6`7JVd9VrsjHw0FRF>rSbeQBuiZVkC{>6$r! z`S13sv1tAuvWD2dXj8k>rAhlcNM-N^kpw#JTrls!r~cNOwUhV~OGS}hV*8HM&;eCH zW_&NhJwF-AP)X1G-~DRn{{WXiGYfm@^+{Kp*RA+1yw3|+ka!EUkH)-`L?E2x@!Gvt zz|W5jLl) zjO6z|w5plsJPKn&)aB0u9qF>T2*3>SN=`}IFe%0o$VVB$s`MH0zsLJiCxv`ci^BzS zKkuKsJdk44ww`)sJpTY%#rXEDd_UrG+zEg5I=}l1+%x<=@e+4Bn(^2E zSc>eXo21Se{8vZPh`YcHG6#Isxb42x_Y^Y#PSxX}%~A!I1dXGn1xSU^h6Jxa&bgVo z+_2JzP9h|Q7%Rutq5Djq-~M%GJH@wkXolGl_XoyKJ8*cX{iZ+p=->D4f5L*#kR$z_ z{3ro%btZ39dfEK(P~QH}9v!%agfD*-qZ?e^5()ZZy-6k5LX{wPH1Ojcd;V36sWrTr zqNNtLJ`(Z2gFIK^4-m;@mvUVz$+0Ctjx)#UUhDAN;1Bk$fo*rL-_1O;C~c@p?fhu? zh|ym7`q~z4-@eEJdw^@`4GP>_X%T$|~9z3;Q%_IAa#8sKR=DvM(R_?Pu!$ z0J4UYtw6Ee>$;@Krz##$RDK(J``5WxK=4^alSpNiR0d`}YRaxuWL0}fEmJSqN2)$` zxBZQ@D^6n8^*90SuD|?ES&#NZ(o28H!K)G6`HRo~J6}O#js-X_G3b3My0sp>!cmIS z$ItQp$r@}Vd0r&dkO9y-jQ;@Rw37bGmc)RbD%8iW<_9P8ub{{Qfa~rlSZxH3PrXmH zl6Sb=BKjXa57|C7h^PD|dYIaJkLA*we`RqLp+}2v&OhawAvxq^bgl1<8fC=3D$_M6 zb(XhVIR1S)IWZ*JEOHbak%P}2D!+kjq}RN9z94O3;!m@XG@&l+5V%$&c0lK+v8U~2 z{KAbW>2sLY{{UwFLMh>UZxl@k0FCJuGx&dnW*^!6#8HxB@q=#ZxZ5{R`|iGz)msq8 zPg32hH*ml zCjQR4c^dUpnI3XTje2K})%WH2U$M!!1_e$*uM5)jYgoK@sLvcKlQc0$xq9;EsyK&9 zJFQHkMNXoN*wgq?`#RoP>C3ysx}+BE%B8f%Fn)u#`Shny+{8B-{lNc#l)I3OOEo9Q|@lbXNW+)Gjqyg3Lb29-$SN zkkJlzDJ6(TB|3DHM^-5?QY|@ic9%yf;2(C=qGniV@a}9bNEjPznuB+lK{v$4vL+0N`pKjO00@HxSd5Pwc8Mg5*<3|YKes}g#TG~&IT zr9006`qQ`r1d?f7ZaSVY{{XYhg-HJZgu7M;`@&v-m1pXI0&ne{CFzMjVw6~c#H5HQ>mj^F1M*1gwz9921`)cp6i@xP8`y@JSU*C}%(q7_z? z7-B+!!Syxv2Zn!VOTX;s8(r~6qduSj^S;S0$dKceT!K$H{Hx~;TSim+LTL8tqwMnE zBkTYSVZkT#uh2XK?gt++$oI`@h;dPig0;toQ{}wb<(B^d0QBhN3N@Wom<(=fqCb$P z$?zHjFg0zL>d>{m=jdy?Q_x`c%=ykZ^i)%{4b2n3QhrHwBK> z98{6+L9_#t=}l+B9<)0$a=ek#H7(y_(CG+JG1MN0nn05$7!BBQO1UKN;81>Hz`*TH zU;)@wLBQu3riLMY=^w&r{{S>ca^biD^GcsL3^DIY&!B(?2MWX=Y6)x{gU14-X!d)b zts<`W$FEG$s~)Caz2U156X`Q)x}CD!T1qg;PCp;0&3wz^PuPxIy>eUq1H{XumpKKY zk=T1=5$G%G&^FAtsmx$7{PSBvq^bNTJn2TJtoa%**$c<;6;=3?9C+viGyeebRX_YP zPsBgH{{RavE<1=P{{Z5v>p>xTM?goVJ+^{NV1RlGYP7pAxSwMG0Ga*g$tn9I`2Cx6 zd`pX;?_17u{{WBGkN9NI9>tdb0EL+o0rF?;vyMLpud7)X9AtfJUn|WC8jKRW=AX8g zW%miu{`33KmEir8d~WN8_?Co$!CPyB2mVAAApMg3YBEp6ph4sQJ!i+){cU|pP{Xw_ z3l1_V#2$>j2T@b)TiGwTe#Xn68ThI>9aG|R z$;N(rDM-)IJ$-nPMmLq~BH)60RBLXKf>JXh6O0c^J+th-;(dqrpWb|qpRvD+;#@bx zi2V*Mr33!}MpcykjeJoH2bbbpt%1a1)tC?N#t1SiT&rukNX+;kjwu7B^0UawAnfT0NJVu zzhaLQGcjL@g`Ixzdk5S90HIgd9$E66EwncSBa=$Di;axCi5vwzO(j}g68nVc{{VUY z=f}`~#hxQqR)2`-$a=5XB*$NN`qfKc*uTVzUFP_WZlE>*{?Cw}f8c-8zR`lz+JPgW z8On}&RE?oW7*{Wak#`cfJpTYnYOK1X9>@F4_^$KzF!3A_VlRkR%*U%XohC^C0KWeK z3a=0BUE&#{D?h{-3G1~iBm{rs)%I$|5G{o0ag)-dHV}r)jfn;h1~Jb{6<63jjlR?S z&yKY3*oRVrb(Vh|$9SK3#P*J%kJoYjRoZxS_CwNz?W~&Z;MMJ5m1Xh~8Z}}FBXB;L z{{ZV((qa_G)re*_tjChps0w)Szw3{gi4M1exD%blaJ9+<@} z_S;uD_Q~&3+yr>y3%S|8UJpY{Dl%bE{GfcA8Y8N zEcVPWIIj4*s44;4eMdFH{AHKypAEc0al2|qYRt#D85#QVnz-(a=kT_EdTTxzi^bZ8 zm!(+6D(bV4VYm`!%k^XJ#e3(0z8~s329@j^MbUq!3CXHqe2kyoVam#(Fc)!NlzMU4ME}y4qk;X^a_U?IGJxTN! zHN@L&-Nq^EX)nTk4B&6S&#&9$#VdRx(D)v1qwoI!6A3X;{5|m=qp00$x<;uexVzGB zMYy=zwWLBarGVo+*J;RJd8F8K#hj7&N1+^k_fb+i{k}m+{{RSdJ(+3s3=aPQZ<8bO zuC_&YWh9?rQW&0C*;wF_j8eH=sN&=JIiN@m>y1Q`I{ms#AJ&p@f!-Tuba(rgUS9`#Y{e>anRD|eaqyD#6|FD z!-Qeux&(C}YkGQoBJjGL3wgmEN7|mdFpMPKywh4DH!vqBtuAIRL~#%Bqr)4R3rTVh zQE=Q-AK@Q{+=4Bp=aNmsoc^`j7?h8jB%exd&@j2iDCS_Ia96(wJUuK8GTz(8)Qm7Pl!G}*xq&t-lHQYyJ^? z2`#?caeS>KNxpn!WRs7lIIWi_AIhrs1sx7E{uM5T&&{ak-u^>Ed?nCFL3|tjzg$;e zlE;z7NF0-bX?l;998BK{^imGPsAvAaU;Jx`@wdY@(qc(1Z?Bdq2^njaZKns0O?y=5 z_hf==llX&|@bcv3tm}jLH3{A9CmU*fY4QI6!gtzVhHiB!W*1hZc|a69kdcm0y>{{Yt&k^3!7W%z9pk_m}|@#%tVwqErQ znaviXKU3GHT&V*f*Qj_6{{Z5dQMUv!uP>F3(_WYG{R8-KB$C0%t}7jPI%pp!4f$1t zU8#;U>58m{xDAZwwOJo@;B!J^R~+0B004K#6oIy5lZrEy^!n4VF@xHj(kU`UU~#x$ z`cs<$4>$xGXkIhd6sSXkk=W7d4EZbL%v-dN6sZ{bCFJr5+$yi^6({^rz9@_y7f^|? zdlLw)kB$LRd`N^AMo0O75P!nCzt}qG{v|#!hwm@ip>PivK3_k|yXpS`4Ww~R`^VKm zi-0grI#j7XS0zaVV+XZG8y+##RfWr@P8esA(-q5ebiyQ8kvBHfByJ#Q1Jf%LDQz8a_Yx5lkj=;6}bV}a1` zKhzrc{aR6NrQAq4VH;q3?I2dk>7dg0QZaP*(RI;zX$mu>(lbo>z;`5uAm=@+LHsGF zPh%y!MYcC|asy+PBX9B*#@fSu;opYQ%l4ORrne2BC}uWndJLYYtvX#&_U}iXt?nnp z_t8ZgASy&)F7gjvpwu?Yg1*S~h|tFxE^~}8Jeo;vBZ8<>m87{6; z$**LI<#%R%fPZ_F$P*_JuwDny>R%?5Urn$IT zt>Lv1gk}Mxah4=^0Fm4IQ@iL+jP$VEbI;QhJ7jV*^x~kkE##<^mc|WBl6&-|wO1(N zwXcPGZnxumKN8%}Kicg=h~h$_FfvAdT=hP+7l%F=Y2Fv{MgF@C)6IK$PU9;(~U;)~*OJIY>4PMqH{{Tn|4sq>Sjtg*2bgdD= zJ!Be`zws`c1P%>(KZYU~UN^c2A&H26a9G!;YmKu?mv09h>(71`TK%)f7gDw|WCRT7 z8$qmQ`ZHQ8^$((BD;j~-0Khn|EX(10&2CwvRg&rCIb|cuX%rGiTyDUwvsPJKOSo8a zBq&M&>-ckAKZW&OIW&u1J~(8a<})iySq@_$btk4yK>YnF7rWHx^xYRtzPyuBi42k~ zg_{kP-ZD31*RSVRAn@jz5;RL)qB$CM&u3skKaNdsIwHxS+SuQ0x-!paHO0y)Bo+(; zfI0#}%}1i@*V4=40UOQ~z=j_#M`9hE4i91gJw0k2-iC>2cDJ4awY|C1kw14~X0l=k z#y1xC{7C#wUc2yam2@Ho0+B|7GLaps=m8r~sIE(0mP-v@$4s@72wb$AsX>zV)5g87}W8WW%;Mbg67q{^AX5Q+1c<$$Co#b}h zn{syKbmIrF*1EkoUEb>!7SmnanBlcq*sO(jo;YfJ!DRZKqMUnkK_nc|pl7BiCyY`V z1ccy{YL2Zb7AiB0u^iRO+yyw!Yd>0V+(M^4bJDH~?9QXKOx4E&uN4i;A0_jFfyF(E zjE-}~Rn(mQibfyZJ?p8Q644(b>1_I+?K`5t*uq?TcEN0apHp9Wftzksk);QClX6GPg56F zUi9^lbim+#b;_DLcOBG>1A{;zU6(i`){(*52c;?_^q`$ZL%9k0N$G$o zcy2q6q|{NnBd*eMQ)P}%@b{wQy~hlg!NwS#Nuw;T4s(h?3ycn1uoNn{Jxwh@e2a$z zBOP-{fU_T%nvAmsA2BD~RFXF3UO5A`I}1*NpbAMGA6k%YVx#!KrB;SQNd$bgF6^9- zmj@oShD|GBM&dSuiX)JgY*0XbD<90>*wu%|;Q0|AIeAno_{s^RgH7q6!^IzU=EK2ii^0#6t; z@1Z?OJl2j-6+uJJ4{BdDs;E@l@7E(VWlsf{38Ai@?Ni}PfhQa4U zbj^Cr#M5VyVj!kQRA)5UUE{aGUE7bXAh{-Ff8K-i1JZgQ9@wl$-vLKrRYud5Xg+?HjuI2cQL6lP_U`(xXULXh=JJ z)#?r<>Y>V=nbN)9%5_BAI6%ak%RXCtN$ z;YuKmCk$QH@J>L<{HZ&QXh6|0Nb*Q$&gN_#!_u83aiy|u$eEnyZ{5cjr^#*RTd99A z?>{I!bJ)~Y(ma1GtGK3iel+$PL*s>pRV7lRpOkm1a-^2Tvz5=G&?GtEyLj#iJxd}+h7Cr6;WRDGpX=1;a`Ina?SCn8fA%F`#xp;&^RMkZ1e2#(zrgG-&apS&hg2SjiR5>Yfa~xA7GE&WCdp7k5#tH!xgs zk|O6A@+l z>(8x2By7=-;lZgwNYBUt2TFMXK?ekVX$w?%?!JSJt@9cSP*akr=TZxd82Sb1p#rMD8MWCu|~`SDl(+=+LCDJQ&t@mFJ67>0uBlE^rGVLkmQr~uQl;&Z1FAL z-U(np`~_4mb19``=I`4FQ8xY`(cuxo+wKvAFeSzt_)dR1_D=!IW$-SD?a6CZCyaX6 zi+p=V?Vg`cw4_1gHuS2{p<5K`NdY zcLV~nCtt_>Yprk$SkF##Tz|w(-|&lEl^rBQ`s4c3TZFbe2ji@aJ{0Q?k;N(6gKWx5 zoVt#K>s*)Yn#2AT=>s3@4+HAo<6Vcwha=%;w)hNIB{=^8fr{ckWa(A>5L6uDvU_0V ztF!)HGlt&%&u+NMLV8!F{5Ng>9+2mSlNkK}0K&Y&>CVH0$8qakk?^)s{vWtfafx{2 z*#7{Hah;bt2*54VII9do@_PEz5t3Msx;oUSf&n1YLqqorag6)ZaybXDdPgAiJW@Kb z017u7L$?rf&MHwSd{je`>ryJ?jof0GkDGoo+KDfZsuAI3OH)^#vAa-BV~UQzoEJ4fQ*6TvVed?@Sy#&92+>W9H2mVXiU z3Pe<7WP4P_S{A_=IjEI_F+6QP^(Z@}%VhCc-5L@sh9)OC^v7zS3I6~+#Z-P6kO{|9 zDcg^)=~=Yi!)J`g845u=ML~9at65m(fJQm|5BOBuw=aB}&($Xu`d!<$c!{t-;3m1} zW2O8yN0$E27KZm;@iwO5DK|1g0USEx#iVDTkmLE+ys%eX5tCju`!hw42j1PVA+E1y zZk>bRSFnizB-XCWLgK8F2`%HEBO9nG&;ltE$^=D4g%l4#igxcWw?6ct&TA{&w2~mW z(rxbI@}`9(PPN2eII; z%yGvb#((s7_92+YA(d-XWv{c1xf82Zyun8k0{p=1rq^KD98ED&m)RMsbQrG(;y(wT(ipyk&EenBenPBaI_waEc@&1cA;u z;)5tf&#!t^V}M6F6xh0s-<)xZ2^csuk08b=2?{z?m3>Omoxj9+sv5xk>aO9_yi$%M9Z^{JDX!oNe$6&z{3OFIFM#+@6HAz*${ z+Z31*MC}%EIXnYP5pDPcDb6{h-ehc#%B0?)hAJ42NE~K?5xigyPI=~+IVFkhO5hd9 z&tJ-cow>*WRSb-0oOJ4as!#w;s4%4GC%rDunOxwjbsn^vwz5VfpuIx7eV;w2W zakeIm07D+al0^v_%Mw?U>r(k=&DefYdghu_aLCT%#wmQmD*)eo4yJ@47=l0n-OnKO z#aUTR+>*&Nk{dZEyJL#3Ra}g8CzDEX3BWs)9@T3>YFT%UcYLBn0AQ~i(s}DNu6BsW zMOEkpHB}g7oVTShl|cg}HhHPGqGhmxee5I(zzi>TG&}+Y^40LMyvCPyWJ#8~^?%||QwI1#xh zqqyry`3)07qDc$B6fZl6T40ZC?#y{T3e&BwWVTjdMhN+oj-%FFh6n2Jbm zQPGBZQZ3lP$Yau+q44O(jOQM-vH456B_&yYWGX)Q_)-ZmIW2&v?w+*REs1U{j+( zJ7jIg-1ny&r$t6$s(rXVxvJ8sgcMfcN#EZ-)jh4mR}CDPWdv+yBRD;UA*PG3c^{Jj zMaYoy-k2O>s$ARoYRn`opo6ixpIXt0Qa$lV?2w`U6&xS`09I;@_fH)0v$$s5lZ|fr@M=_b4~1BN?dVxRTw`!VQ2Bp!1rdbSPZM zv}88c9YuM6$L+EFBk>Z3$#`+N_9caSl$doT!Q6Y-m44Acr@{{rs-8?L06wMERYLAb z5mVqkAovrbPk-?rQ`OpaSTw|2U8H2Wl}YQ{8x4IkY;sgL2P3GjoBsf3>xm%o*NQDN z3OADMf8A0)sjs7;KRV>q;-BwDhtdf5y%_@OR(a@R2kBPh7|%Hw;8Yq%IwhIM1|iT? zsu`aOa4VS`4ru$ff^ZEWbtL@5B9O=&;-=s^Sybe8^rwcv`Gzr2grX%(<`n>SC!wh_ z0M2lIDg%rFY0DrWl6rQh=r2Lc`04X!^rT`!alsWBeov-pM9K*n%^Hfp=W+r^H5oa` z$@Il5&%wq%l~l@ilbi|?AE7L1h9`{s*Oqw4Fu2U=8e{=* z@sop(myWe1x(TG(&9eaWSbCO_tnPtH`9sqAjsDF!kDVGu-B*BpYA-I8inn9NnQ*!9 zT<4DNe$C+xQeK2Y!$0s7T^9VVGtF@y7G`^Y0_r7jLoPo+)+7$Nd*1VtX(i6$!)}FWW1|(#ktxqM1a%Zb9uV`4}<$pR+ zsoI?W{d)S>lndDkoM*0hYM9^4*@?#_QOYGV)t6AV3;w-7I(XD=O9C!aJ^8OC8nmTy z8HGz0r!;|1=D^NLJ!s`)_LgU>{{U&*5BYdQ>CHH5cFcLXh-0?yYswCzD&uKBqncms z8J%&s`krXzY<|~M)sCS7APb1`^`}XDZf%_-kVz|g9ssW=I)uC(=RJ5ev!m-Qhh&F2 zrlOPFmr=_@dT>#WPhOd-=u0s<;;ykvsFaSNVyHf2ZaEdJFh@J_4(sgN9Iu_KfVUk_ z6^Z*e>Zzvb@|nKu#GTF8?;4llwBUGh=~UpfEO{JevA!C{VDSC93yh7!9rMo>gqgi2 zlaoG)U24dW`1wqA9MjiRwqcQQhw5v}*5*-+lfcC%_Kbtn`(~|2K`NRat^KQN20Zj5 z>q<2{XX!ct^{*>kMn(e}826_gMbzyjx%4!0`HR{fq%|9Uo_Y*=ng*uN=75 z(aUi5zDKAV*jy54L63SG_5z@NqCDf)yuXTS_yo~ zZd9uBRZl!tP2_^+W|4D(c&;knRFNbEF~Q`D>MZY8;w}^%^y8&mVv!S@kd47S^I2N^ zfv33R>ss>1f=)QDf5fG}z{&?+*~Wdp8m6vcC!zB%?8dI&v|gn9a>gs-Gu&ls?t5ec zFf)>Q&#inx`!HL)e;>6kF~;caZAR)wU+-uR~fd-9*YZu>kNp zP`Ny>BOPf&DFkPl80|m@dh_)EAZ~@P1HWkVE*avgL%`^nOP^1#W@^rU8Dg@FW)F+-_r z07%<|NaVClz+9Z*b4e=;QT|Y9V`9V-d8-ZOq9{np_bhtTZTA?GECNS7)U)oIF(v>A zc718@u&-h$umrBoP_8zQUTNs872g539;dY;$Guo?%c#yhX<`{tx!g|#4k?KeCdm_G z@E4L;b5cl&_LJp-w>Tb#qe3JE50#I~ayxp{no+z3$IH%rXuBGH#smu~IqEPCDT6yU zf_oB8OKlLFd6Bj-B#f^Hp+w%>cO9Vo+;pTagW4k8Cr;Hgd?wOJ&lw$YP7jUIt8f9@ z$E`7#>;Rve*iq;nrGkwdPq#Z)w|rA#kIZO}!}6)%o()E~8=}i@C%WRSz{-)yv*ycS z2J4D0JKQ6icww+|Hk_W6`7jdSY+^XkaL?*Vq=ix!&ceV9w&ur5Rs_rd0hs>)3bsHL z0=nFdq&{dE-II)tf~JNgGdNOQr&Xz9fxrc}{N#l_xTxcWqR-A$o>+rG(7979=PC)p z1wDtYJ!EJt+%OxMhFsG8khD%edQfq=bjP=PW5m<3c5IM3AMl}xCNIq-VdX3V;2&|? zq$~4pGHwH&zSP@*jckp#01e;kIsB?iD=~0j4Iou^`>fdG)|Ko#T(XgUniysCRhmwA z_di;4JIxe~&J{NWVtL!?Rqqrf)QXMf2)> z{pM%K=f`7AB;3go##S|45w|>%QrgPfjl7vK%vE*{znwm7aT9~Nyp{goFdd~E zxEqN700K=H=vPsW?#E*`eqE?L3W@&!c?iyaUNN5Z6?>2whSL$-oNYPl%`C9WQJF}= z>5kOUh$T>nr+((?wAYmW(gkDqMdBuO&+d?8+{mDRI`sE}n3i+U;NaJne$ol{kAr&p zh3EG;Bb@&ED&g^?Dvk0z4~M=0YH(Y8N!RRNH#c_*vZD{XwG{9F0MLi!UryM==1zm2 zwer`%tu5E%9;;&aow~Ct5AUz|X1tE!n}t$BnyH7$>-EoC#lWXKJ&$OMT=47t z?Ort>LVu-A{j1@&2X3^v9rhpauM^!NJ^uhYT+5EXg&xmAdqmH2`)7srC;U{A9R2LX z-!JJ+YtIgd6^DqRE?kX*C+X{)SBLJG9Z%;^^CZRzHC&IV)kM#5SMb3Jzr^rHq*H*z`qRAk1Yn=ej#QX)$Fc0|d7**Mw+QDSalgWu zE#8E##Wl#B1HstCKc#rtknQ`#53Mz%a=ft~`J~{`DXyorNp<0&Gbr&4as}v0FwY$J z?NI*!Yj|~VKel7{`A_&)jR$ZB80YIj4%j=6ezbBibHw&ZHQx+G+ds9Pff+2QG5X@7 zI{yHLK+pEGk$`X$o|WUw9naqOqsn$19+Z1GxO-LD_3!vdyeO&&)NUM}yHS6}l3x*c zOiS|KUNYk(ltKM#$ksPK%`Vs7$>~&~+#O#d*7d&=_)gy4TST8xy_B!aF1)1*-h*yQ zA6oJM01(`p%}#5QHuc5aik5AGMv#3GnLOA3k$l z$K{U48?*Wf?S2kjeWT%ifcU^R!;Jf%@UK1nt)OW<4W+WC?V5rDdkm|8jds5VVwTI{ zzK?4!`p6>k&*z`(TF>}DGdM4N^gS6GYxI#vDBHfcuW`^kLE+22I(OA?E^Kera};QR zqn`ODyo*A$@?kQOoYePHGdUyh#bF4hj+WF$)Ld`2JnqhZPX<28kQ(`&;ALYs(Z!PBL>&-6t6& z;*L!Q>MQJeiSaIq7?XD(Kr@h>)(4HX+f7GBme$jJqEa&L*mbTrZyvn+)tE<^tcQ|m zsDqPx91o0^M(}>Nh~XdXlHreUl-H7e$nxXEnu?A`nVkBc^P2V#9>B@r?P@SF{)s8h zar_3nTlPzrW`lk>KfN6}^{$BD*~{c}N$ReB2PP$Lz0U%>Z-=_PeiyxGy0-gGtiuv6 zN|DAg4RShlt6f~DJOf)7vIrqDj!kk!TBke4S z{o(+x6)!GH1myP3W@?rfx5(+|n6umpzE&R5Gu{6H;WF_44%^be`%|Lvc8N53TbBH* z=Br-q*K|(5nYZwXi$Aaog>@V#JWQgKGFx)oBsd_Zkz+E z%pV-^E5^ml`Q=a6twX5D4i6OEdyAQF9zWEMr>Qm0FfuR)d>$+3uh}epllFkWhb4iv zy(Xby8MRM>R)web`w((bos3 zC#6peY-Ax0{BiZB$8Uh`kV?~{l)AEoXtfgU|Za z&^97l_BD+MT!_LIIASbXMePfCuYX z9t+g%wOt0z=H6tIHir7FOHtGiJ?ZA#1F#;nqEK9(-hk7-&<=7q9jHsFHLjuybzEcb ze|UANJhmCeLGMVn7#%VXN_dzP^KqW_Ta~v^SVuwJREcf@Cj;L!!!A35K&MA>v>bt) zXRS`12v1OJRgu)-0x5i!g|Z0X_U}Qt3|FU4)aIWf)4w#{#UzoxqF=m&V-xtA)VqWQ z4~%nMm8IE71$y?yb(($9yNhW#IO*1^Eo?=)qszW9Gs~k(3LUQ`E{cB-{<*8Z5w-h1 zhhq}s<%T{p{>s)5#~oTdH%+;aFq6oQjsea+tEljmzcr1NL4XemDP)7N1L|qXFaRD1J&ir*9ODGlT@$$j+m>7%yL-|0Y=8j^j(}6d zxJ;fiN$2uA(R3?5;4N{~{#7W191Lcf@`H}pr4sGvXm%Q~?vLC0q7~h+aO?ZO%6sl(p^cqKGgk3^0#s+Jg@mesoK)kl>{dnp6)}E7l@`%q`$ML?a9-nXL0t>(l zn@Qu3TBoU$_IEya{gh(+PsV*-Qa{yM+?E7?d7~Ko#eJ=8aunmQCcZKKjuY*F5WGus zx8@eu-JkDs{Rib=WcN3rduD~Gn3G1AF^J_*%1Gl6|Os}^zY%W4$l5i**W1Y*6PH|4b zMF4WAoKRx&&z4T(-xSq3I6V7PxLuP64aY(=$7+p8A&EaQINMS?Ayo^IJ^g6{?3jQ@ zUUNYsqdzb?=e8|NT6E4D39CzlEa0Dq*Uo-{#l8HB9Ai){Q^`wZbIU@uQ zN|GcGDuBUq!Fk{hdUf1sZ!EFJ`|mBbmtKs0XceC15ZsBS+konSI(t+IyOG6Gd(t zF^LI6qbH}mHX4f-QRHG2208jvi2#m5SnO=~;;Y37mobyc7$A4zt=n07kom&kI}DQ+ z2|RSYJG!174WDp?dHL@{Je5!2+J0M#^!@%W$aTRge?N{#AA>$*uP*@4?Rv+chj2QqOZ2 zoiCKKHt#Wy1oM$qA&_}ecjOH9??<6JmTldw;oQhb&f&)dVxyW*o6SIx?Z60}6H>9= zAC~-lyM9xQR4)R+fM+k)JwT!SS?z%QDjzq%FXxq z9et{$#H)iLQqoArEsP9Npb?Z-Cz3<=ZoiFrZ|xT-UxR)oD&ZO^k@)ozAs@=URy@iJ zWQ;aCab9ElLRu`J3A|1i0(^i-KF+4Jhs2EL?-z67zk^BUd|1b{_+vG77zALGPCuu&$LDlSOnx1q=6E9)sy6>vDJ%uf zL_cTwPeJHSHLaOO3F}r&nLT)(u3d@f zYf56K1&?s_s-$^*3|4W8tcv2qL5WW+Y40b?k$`jFp=s9`Bm#ZtZJ}9o6r%0G z{U~Sy9zYa@mmO(*;7QIiQ=o0QOAY`vR%jbM5ye?I0FAx<>4n4Yi589<;-SY|VlPCSaabHQRg8>|HInQeOf8q4Y5AAge#g|ELZg!Az2r=OQ z03%%#wtj?3AA2*Dk@m6qjw*QME%Smm_xGm{C`zlagS(c`6eL>#Cy`hhE9gv$6&RFK z2+lLondB#-q*PZtlabQ~lguLtkO9hhy45eIPjNx{!E!IGBF@_j?j6Z>_!gQJ>Z2vy(nR(EJ7Q zJHu{%!J+EV#!gBq{HOJNW82ZOASk3V8t2 z{{Z0~1CKfVO;5Iu@*(>t)=c?sDgG*=;k-4f$Uw$QbNs4AzWAc0cKB~t#yK8e{{Ul} z`jluG={sbcecEIi3prwCb-~6+srK;y0H0_*pLWle7gYG9oF5G8>~qu0WBn=8YhM&G zli`h50P+eqAEkXy{{RTDbQe-v?FW(16uq>6=h_ctZQDLr9w7LhySDga zSRjlLB4N+vQpe(7iR!2RDP3D5fPALo^slHO&}C@J`#}Wbs$!;13Pn~1~icj9k zs{;}bV1J!w_!>`%ehNl{(?Qjyv}_+G;A}6rueFAgbi50c>CR#5e>zX>o3&6y+7J6< z{{YvkScap?$gE_kH7;b?^2_`|_?5rQ{{VzjQ(T-3LfQQBLwNJzSOJ^D+O|Ra#x@_) zzNlR`@bGSs=bmBX^36Z{BKUQ@k8fZgALCK&Q{D)_X8N<_{{Z+{e-MJUd^4+V^$@rC zP`?v=e+WY-hIL$?g`sc$Ccd*>CiiYy?ml~YBm8OK*%zBf`doSThac9Tv|S*Csmr52 zNIw@mYZH)sKdJ(Ic_e@Aw9)Z@#_Bh>hxIIX{nH=)mcF`OBI$V-5ofV5=lax(q~4Lu z)I|RP*8#}%>qk5~!|@MiKIh2e;`fb;t3~16P%m;~IQ%%NB>2PQh|q!I{ZUkPK2vA; zSJuNxyz<7|nA9KoW&JZx8b$F%A8Lr4;N}s}>rb9P$@qsX`=296@u$XR+sx24E#wwZ zA~?t8Oq1h}i}x@5NVNqR>E$2rudhazeyjrA#8(7-*5KpXllvC*Fdt}u`~8>-YE=IK zm+==ZMb#f6pO2m?MFePfgn`LqKjBSZ+8f01N;l|p`r(xH{HyE{q+X~yZY}ag2oMTX z(eGKn^R4|kw+5dzKjr*Es*h`bUo+&GziFQlDNVi}l}AQp2PUa_i{h_|JYS_v1-6lQ zZ1)6*lLd(w&ISh+_9E!l+e-P?qdvC7`qa_r*WpMLT8{q!@$NsynyF1{qxh2HQcBLp zi~h;~01I_L2ij^{-mMc`PpNrp4ZD%OQ9(IwIL>`*==c6&KmnEbuEQnAKZ50@ROl1UzRoy2f)ieMjj3=!`{b7YXCk4jL%5R7t7D-~o) zgvRat&?%};;m2QEa)J;OjjVA)NAqsaIO3Y~0ab`#PhOa*7l6-^!0FzQgSkuKV1AV7 zfWa8!Jxv-2VC8oK@{Y!wMpT~cDJ4SW;B5mPJDO1$U5AsC$f0Nit(oUTf=Cz`r+G5+ z;wCVu=0G}qX)+M8LH9>o(hGvIFv;5ZCkF!~j-Bd+N)Q3RcfUTgt8m+7Il*I+2SZ5A zBN$=49DLNVz+H>3c4r?-fZdOl+{ctMq=bOqCVTd%_U91{DJO&NQXyd|+lFP%N$F84 z;r!yKC;Qz+P>DRoWlZFda53mA#Lf1p&&qJ1lI(Gstcr3IZVym%RxPf%+=v4OAnxX! zf$BLTNfk1|iR=X{z+*%tFbp!J({0C?&GUj6u0C3nI>^nnNRJ=@PI&LlB$)I=?W4?_ z_K}Wr=~7$G9lR_fh@H)n?b{#zx?>lGN`_Mz>FZAOGj3BDBcL7WTc{y73E#|a+~8B) z{MJJ8ka~yBLkb<^EyE0B9V)@avpR0d9!Ueg)|%7>D3P=7+>Ck-{{UJe3}hSMDUAH| zl8~bjobCg5c{Mm94a*@`Qa}S4`coM6bu%kRv?JiR}q+6}Qe)8~C1Je}~B##l4 z9r3TryT27P!z>sN9@0V=0LHYNg=ucAIdt|zf=th#JL3rcH2kDxPriN?TK||#- zZdl3rl>5{+@~jB1`Cl*i7uKxX{GM+Bvon%*hU1KOtiYxyTrIUp*uT@ zOPN^w!PmS8;=coUmfKmfv5?={zTYFDkxwLs{Hw3D`2PUoSfY*@ydkMgI2diIxPAvb z*WJ_nKh|Lo?v}<>d=1Y4IQo;Cp#B!r;vCCjIl=z`MF;s}x}8|m_?O~xsLmQE_n#0y z?G564aGz-KmZt_tP&~2DP6t!hH9CBC@ommZ_)AqNcn4&8AFX}C4}vurUNE!i`=6En z07GBHigex$)*)P^whT$e7S(hA0M@C!9^Z&sv)!+`pAY{4!t3#wg|_%dRLK4&2%{hO z)iNKBelhDOgtaq{$+7tS>+Xf{)}Rw>-P$8#r`T5>ooYw$uB);~7dAV3WZADjg+6La z?EWC*RrOzq@T^}QJX4&%g|&oS9mOD1{Y6NAHh9V64IhN{UD?mvRlxP@UvwV`YDJ1A z<&w5H;jGjSKN=sw+SE3a%=Z>xsQaSG9p6eEsedc`!qv3zauq^Bw2ZBdZ* z`A}dF#=ibv33!h^ zqw2oqd=|eN{A$rNj|uAFjy~c6pUJ)q5D04+^Piy=EdCbpES4>KCEc4vxaDK8OsV(ADCed8zld_w?!M-H0sjCCtH)c8 zd?Tx4wiSB*boBVYIhzbmG^M)uC}Y6wpxP2Q=bE0&!yYC?V-4Mq z*~livPkd&MdSA=c}p5Mm@B2I{1B&NIj5UwYek zXJ2=DBfhlrS+alPUak1l^7t>rH}DxBQPZVVZWLIekZ?WoM>Rf?{6))Cy8FN2p9R|d zTKI=}k-B&%S9K(XAy8+ZdTab;_eBcp}Q;sX{$vhdZ4>e8wrcr{B zma0a7J}G4IPPUS5d%J8ph72uKgUVy?&C91nc4%3g21<1S>DuRFF^O zOiuyouF)&%RlL-x54{z+=E3B|K;TJ=6aHim$Ut9Td0!H;jUsmK03 zNiW0?hy)L__!q=2{`5&0{BqUyLU>tz%XxSuG6RDPHaBd~)7B z_@L3KPlr0b{^XSZ02+OJ5lr9)EYxessw`ALQ|R zN`d{){=G_-HM$=p@2mU|kK*xP#K|Qa{vYdTy~*;=^{p#iOUL&unS3X#LJ0mKhx*sm zY2XN1RleH)05cWAKsm)Rz8{#_2f1}{Fjo|>PogP8eb1L4Dzs3&IljUi_`256MavY z7hU+0R6qPH?Quvw-XH!dt){c_9nj<9{<6o>o*(`>UrEd0NJ_W*M5^A$wIJ|3Cw6Wm zAvgy-(RzE>j!M1%00ZY4bq|Rba5_ied+SFd0!d_y{eO5_U*MqlNKY4vF4|=@N5?M2_nfR1AWrO^H!=TrlPk8 zN^SenHls{H(iRy#k6-0TQRmp8@H%3oWg(SSc7gJhCpo9I8D=91x8AY2(2*4Iv@!sU zLW8$)sCEzUtxR2zZYOtbr@y^L<}ddb^P=yeO?NyA)L;Qpd1?yfK|ZvgWD0oc^sZF; zv!st`Va9V(BM^4&ITYe{jE=acMxe0w=AQbCaiT7G%}OFHMtG!FIVUwJJkeqsxCHh& zr$(hzZsdw_Vg>~$`?Xq>o%9fZa68k{2t4!c>q-FJIPFeeihI(y(ha#7rBw(qp0xJh z?(QfKP7fJA)Fuws5s($YG`mI*8KKvscc=dVbb8Zku{P9=1~5;4)h6CJ&V6YJ+SsS7 z`%<{lK&o@|aw<QQPvT0fT@!s3AB%TCfHVbJCAA7tjK2$nH6* zRDuox=eelSdenm$>DHMja9yL?o>&fhQy1@GwKBk+wLBS-qwJy=MMJgsABd#fWhQxppF^phlfC1+ndJ2rW-rW0C z$h%ZFe+rxRD#H)%ivUR=cNFweqbH&0F-ZB9%Q5GtN^xQ$9@NNoL$UKHJqhH~qxOtCR7;Vo4@y$$5=*BqOf{#u)R( zP+s~DRS~xCa%xzIobDKq0_TDM0N1FZ8(SSlDdQV^jGP=EwKrWx)s@LY{^>>za!x8f za!UGiG_2cGfsWM@gA3piK^*3vK@*iM;BMrO)gWSU4;*8P7>L$3UK`et56Z*WoSwBP zZP;{efWRDM)|V_;d1nOi$4XNeNkHlf=8M4=0oOwKv)~AV!%a9!)uwV=94oCkB&dAuXS~o+w&q zD}+zBDS{8Z)sInATd|aq{{T4tCOwC(Lm&FQF)NUH=}*XM12OfF^;6?@~PupuUlip(xqM7cc>>PpzBdHi3lZrW%+ZOmNYV4h_@Bp&PTN`QQpI( zjE2KySR7)kMYK8w1gQJi=k%n6dGI2hGUq3~Noj5xW(AH96#WLCqkOn$xKEhIo3Pw- zj?|zl85=AKIOKE#p{mjW1m#D~wBt2$Yk%};=MDFz*i#%HC}J#Hl(&eD>m!m~AE{x` z4{mBdEkaJr&K!_Q$FJj0MM%s)AU`2tj^8&*s?KDEy(g}3xW^jRMu9IEQ96epsOeuucL6=aJj(zDy`I%@3|;a7$Dvw$;)HC7BRxi z>5a|KLE|2r(HyUtSe?UvLsspgjo#tP@}v=uTvGKYf;)AU+E6zjA3olrnzIG^nRX!a z5fp_kJ!+)3ixGLt7G@w|911O?*>jAOl5%}T7P%rTL`#w#jHm8_!8N6J>$OB=!o_}M z>7T7-+sx8!#ub&ar?9PEK@74+%tq!=P6wqVQi-23wXznE%o5BqwoU*ZnWT~yHiZrn zWgx17_o{s|-0E6_#UtTCBZ1nVIA~{NXY)1^p!DLJ5mq}%LT;OS0g^W0f-6FQFU0MEII&VT(>+Z$E8wv}0#e$L=74`Mo2jrW%=(}1j^GyxZP%DuW` zmWXcqk=j{Xut|4LnTW`&sy64}+N#4Gaq1pa(@SnL2?S(djDRX}W@4JTzQCk4! ztoV`EK`g-n$S|sXF~v>SQkKIt83f4-7~V*eF-0>k82k$d$E{Yf zyp{C1VP_=}?&rCtNj#T&h)I|-#uP6YKaDo*7SPeQ5xnwUPQo;e3ZgjW$s7!Sp0#@Z z_3oq-BrO%1jC<|?d(&3Lwa{s0E`X1e3~}k+tWBp0+Cv zy=kG4soyz7F0sker(FGN*V_EsRgwWB$r6py5rxlk4u7Q&Yz6$7ASptGZRCvq0QIWW z8e+;VQCz2*KyKq7N?VrQv@sre{z(|*%Hg)>Bj{^F(XAQXB?XHe+yfdrFb90p zQ{UPxmBU)RvAYF8Lj0KoZprP^vhA%>JKLbeouecn&jawTx5M|od<|(dF-V?s9P9&= zkMXAT+-p~3pN3?3E#4=V3AT_n07C;+^)*XrV-d8AFBw-*4&XWbJ?l$dpX~aq7Eq$1 zhAX^`oM$-wYQCj&CF;imkN|C}+j#>&ttDr$w+=f`dBaZ&PYhvEfT6(xp|$&ZY7%Z#co|6fat|HFRB4T^mc;>sF(k0b z&*MT`ToXi4UBP#6JYq%zAZ^+*549w>F-IgzDBCniwC(D9^UX_d16$dW8A}74>=`+# z_m+{*83~y47%X#=O*X7Z%lRjg<7BLoE2tob>5<3fQC>!t2^dLYEUU=L89!cmt6H|5 z6_l;6mC_(AOJAg{{RYDp|=sj1CXyC z<|o(C)nBujZVI%FcJ!-P7O@*}v8jw~4tdT`dZoD6b2h-K%O~hv4 zD1~1juRXd7uY0yFK!rtB5TU>w$m>#FOvz;!2dej^#Ga-l>{mCM><y|F?N&{}M++K+Z!hL?E^E@O(`Sdg5O*kuE)7c;%MjR6bl~HD$40NaG^2A4tdYvRc-J^fMOHXHBd7sW&STlgP#@konxNLD!`;E~6$2u3QYL g$I5%uUSwbM$o@jC&OwYW-ks_V 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 RaVP3A`q4#hrpU5C|JnbB4-^0Z literal 0 HcmV?d00001 diff --git a/specs/kbd/logitech-access.jpg b/specs/kbd/logitech-access.jpg new file mode 100644 index 0000000000000000000000000000000000000000..94f6cefe4ee314b9cdd847493efbc447be0cdf62 GIT binary patch literal 13710 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 Y)XI-83H|RWg8#fX;{W4!2>&hoHyq*A@c;k- literal 0 HcmV?d00001 diff --git a/specs/kbd/m24.jpg b/specs/kbd/m24.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e8088799226e5490930afb90516f362f7572b411 GIT binary patch literal 128580 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 Hf8YNHD5V?6 literal 0 HcmV?d00001 diff --git a/specs/kbd/m24kbd.png b/specs/kbd/m24kbd.png new file mode 100644 index 0000000000000000000000000000000000000000..d23719df61f8533e7bac66b2764536962821c1db GIT binary patch literal 22569 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 literal 0 HcmV?d00001 diff --git a/specs/kbd/ms_office.jpg b/specs/kbd/ms_office.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d0f2b4af23334186fe2273f1f7fd2d9529fa758a GIT binary patch literal 51017 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 literal 0 HcmV?d00001 diff --git a/specs/kbd/ncr-s.jpg b/specs/kbd/ncr-s.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5bcf80ebf2e02755f6c7113fe4a3908f773556ca GIT binary patch literal 15932 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 SIg3si0vpXZi{d~p%l`vcut2{6 literal 0 HcmV?d00001 diff --git a/specs/kbd/nokia-left.jpg b/specs/kbd/nokia-left.jpg new file mode 100644 index 0000000000000000000000000000000000000000..21590fba47f18a85f7fa88e8801f0a80232191f5 GIT binary patch literal 54651 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

      ESVKnfuMB{Kz(nc|`yz<;>|)D-`- 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 literal 0 HcmV?d00001 diff --git a/specs/kbd/nokia-s.jpg b/specs/kbd/nokia-s.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ec4b1345e1d6f421b00dfc0198e68a3605ec3aba GIT binary patch literal 17579 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

      7+L?;V)(21cziIh1ICrOa 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 I>nk(=*~$vpZ~y=R literal 0 HcmV?d00001 diff --git a/specs/kbd/nokia-top.jpg b/specs/kbd/nokia-top.jpg new file mode 100644 index 0000000000000000000000000000000000000000..678df28fff1e023eec64e8f593f81baa1947a7cd GIT binary patch literal 31532 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


      +

      1. Keyboard scancodes

      + +

      The data from a keyboard comes mainly in the form of scancodes, +produced by key presses or used in the protocol with the computer. +( +Different codes are used by the keyboard +firmware internally, and there also exist several +sets of scancodes. +Here in this section we only talk about the default codes - those from +translated scancode set 2. Less common modes are discussed +below.) +Each key press and key release produces between 0 and 6 scancodes. +

      +

      1.1 Key release +

      + +

      Below I'll only mention the scancode for key press (`make'). +The scancode for key release (`break') is obtained from it +by setting the high order bit (adding 0x80 = 128). +Thus, Esc press produces scancode 01, Esc release +scancode 81 (hex). +For sequences things are similar: Keypad-/ gives e0 35 +when pressed, e0 b5 when released. Most keyboards will +repeat the make code (key down code) when the key repeats. Some will also +fake Shift down and Shift up events during the repeat. +

      The keys PrtSc/SysRq and Pause/Break are special. +The former produces scancode e0 2a e0 37 +when no modifier key is pressed simultaneously, e0 37 +together with Shift or Ctrl, but 54 together with (left or right) Alt. +(And one gets the expected sequences upon release. But see +below.) +The latter produces scancode sequence +e1 1d 45 e1 9d c5 +when pressed (without modifier) and nothing at all upon release. +However, together with (left or right) Ctrl, one gets +e0 46 e0 c6, +and again nothing at release. It does not repeat. +

      See +below for a report on keys +with a different behaviour. +

      There are many reports of laptops with badly debounced key-up events. +Thus, unexpected key-up events should probably be regarded as not +unusual, and be ignored. Another source of key-up events without +preceding key-down can be the +fake shift. +

      +

      1.2 Protocol scancodes +

      + +

      Most scancodes indicate a key press or release. +Some are used in the communication protocol. +

      +

      +

      +00 Keyboard error - see ff
      +aa BAT (Basic Assurance Test) OK
      +ee Result of echo command
      +f1 Some keyboards, as reply to command a4:Password not installed
      +fa Acknowledge from kbd
      +fc BAT error or Mouse transmit error
      +fd Internal failure
      +fe Keyboard fails to ack, please resend
      +ff Keyboard error
      + +
      +

      Three common causes for keyboard error are: +(i) several keys pressed simultaneously, +(ii) keyboard buffer overflow, +(iii) parity error on the serial line used by keyboard +and keyboard controller for communication. +The error reported is ff in +scancode mode 1, +and 00 in scancode modes 2 and 3. +If translation is on, both 00 and ff +are translated as ff. +

      Usually these codes have the protocol meaning. However, +they also occur as actual scancodes, especially when +prefixed by e0. +

      +

      1.3 Escape scancodes +

      + +

      The codes e0 and e1 introduce scancode sequences, +and are not usually used as isolated scancodes themselves +(but see +below). +

      (The prefix e0 was originally used for the grey duplicates +of keys on the original PC/XT keyboard. These days e0 is +just used to expand code space. The prefix e1 used for +Pause/Break indicated that this key sends the make/break sequence +at make time, and does nothing upon release.) +

      This, and the above, means that the values +00, 60, 61, 6e, 71, +7a, 7c, 7e, 7f +are unavailable to signify key presses (on a default keyboard). +Nevertheless they also occur as scancodes, see for example the +Telerate and +Safeway SW23 keyboards below. +

      Also other prefixes occur, see +below. +

      +Logitech uses an e2 prefix +for the codes sent by a pointing device integrated on the keyboard. +

      +

      +

      1.4 Ordinary scancodes +

      + +

      The scancodes in translated scancode set 2 are given in hex. +Between parentheses the keycap on a US keyboard. +The scancodes are given in order, grouped according +to groups of keys that are usually found next to each other. +

      00 is normally an error code +

      01 (Esc) +

      02 (1!), 03 (2@), 04 (3#), 05 (4$), +06 (5%E), 07 (6^), 08 (7&), +09 (8*), 0a (9(), 0b (0)), 0c (-_), +0d (=+), 0e (Backspace) +

      0f (Tab), 10 (Q), 11 (W), 12 (E), +13 (R), 14 (T), 15 (Y), +16 (U), 17 (I), 18 (O), +19 (P), 1a ([{), 1b (]}) +

      1c (Enter) +

      1d (LCtrl) +

      1e (A), 1f (S), 20 (D), 21 (F), +22 (G), 23 (H), 24 (J), 25 (K), +26 (L), 27 (;:), 28 ('") +

      29 (`~) +

      2a (LShift) +

      2b (\|), on a 102-key keyboard +

      2c (Z), 2d (X), 2e (C), 2f (V), +30 (B), 31 (N), 32 (M), 33 (,<), +34 (.>), 35 (/?), 36 (RShift) +

      37 (Keypad-*) or (*/PrtScn) on a 83/84-key keyboard +

      38 (LAlt), 39 (Space bar), +

      3a (CapsLock) +

      3b (F1), 3c (F2), 3d (F3), 3e (F4), +3f (F5), 40 (F6), 41 (F7), +42 (F8), 43 (F9), 44 (F10) +

      45 (NumLock) +

      46 (ScrollLock) +

      47 (Keypad-7/Home), 48 (Keypad-8/Up), +49 (Keypad-9/PgUp) +

      4a (Keypad--) +

      4b (Keypad-4/Left), 4c (Keypad-5), +4d (Keypad-6/Right), 4e (Keypad-+) +

      4f (Keypad-1/End), 50 (Keypad-2/Down), +51 (Keypad-3/PgDn) +

      52 (Keypad-0/Ins), 53 (Keypad-./Del) +

      54 (Alt-SysRq) on a 84+ key keyboard +

      55 is less common; occurs e.g. as F11 on a Cherry G80-0777 keyboard, +as F12 on a Telerate keyboard, +as PF1 on a Focus 9000 keyboard, and as FN on an IBM ThinkPad. +

      56 mostly on non-US keyboards. It is often an unlabelled key +to the left +or +to the right +of the left Alt key.
      +

      + + +
      + +
      + + +
      +

      57 (F11), 58 (F12) both on a 101+ key keyboard +

      59-5a-...-7f are less common. +Assignment is essentially random. +Scancodes 55-59 occur as F11-F15 on the +Cherry G80-0777 keyboard. +Scancodes 59-5c occur on the +RC930 keyboard. +X calls 5d `KEY_Begin'. +Scancodes 61-64 occur on a +Telerate keyboard. +Scancodes 55, 6d, 6f, 73, 74, +77, 78, 79, 7a, 7b, +7c, 7e occur on the +Focus 9000 keyboard. +Scancodes 65, 67, 69, 6b +occur on a +Compaq Armada keyboard. +Scancodes 66-68, 73 occur on the +Cherry G81-3000 keyboard. +Scancodes 70, 73, 79, 7b, 7d +occur on a +Japanese 86/106 keyboard. +

      Scancodes f1 and f2 occur on +Korean keyboards. +

      +

      1.5 Escaped scancodes +

      + +

      Apart from the Pause/Break key, that has an escaped sequence starting +with e1, the escape used is e0. Often, the codes +are chosen in such a way that something meaningful happens when +the receiver just discards the e0. +

      +

      +e0 1c (Keypad Enter) 1c (Enter)
      +e0 1d (RCtrl) 1d (LCtrl)
      +e0 2a (fake LShift) 2a (LShift)
      +e0 35 (Keypad-/) 35 (/?)
      +e0 36 (fake RShift) 36 (RShift)
      +e0 37 (Ctrl-PrtScn) 37 (*/PrtScn)
      +e0 38 (RAlt) 38 (LAlt)
      +e0 46 (Ctrl-Break) 46 (ScrollLock)
      +e0 47 (Grey Home) 47 (Keypad-7/Home)
      +e0 48 (Grey Up) 48 (Keypad-8/UpArrow)
      +e0 49 (Grey PgUp) 49 (Keypad-9/PgUp)
      +e0 4b (Grey Left) 4b (Keypad-4/Left)
      +e0 4d (Grey Right) 4d (Keypad-6/Right)
      +e0 4f (Grey End) 4f (Keypad-1/End)
      +e0 50 (Grey Down) 50 (Keypad-2/DownArrow)
      +e0 51 (Grey PgDn) 51 (Keypad-3/PgDn)
      +e0 52 (Grey Insert) 52 (Keypad-0/Ins)
      +e0 53 (Grey Delete) 53 (Keypad-./Del)
      + +
      +

      These escaped scancodes occur only on 101+ key keyboards. +The +Microsoft keyboard adds +

      +

      +e0 5b (LeftWindow)
      +e0 5c (RightWindow)
      +e0 5d (Menu)
      + +
      +

      Other escaped scancodes occur - see below under the individual keyboards. +

      +

      1.6 Fake shifts +

      + +

      The ten grey keys Insert, Home, PgUp, Delete, End, PgDn, +Up, Left, Down, Right are supposed to function regardless +of the state of Shift and NumLock keys. But for an old AT keyboard +the keypad keys would produce digits when Numlock was on or Shift +was down. Therefore, in order to fool old programs, +fake scancodes are sent: when LShift is down, and Insert is +pressed, e0 aa e0 52 is sent; +upon release of Insert e0 d2 e0 2a +is sent. In other words, a fake LShift-up and +fake LShift-down are inserted. +

      If the Shift key is released earlier than the repeated key, +then a real Shift-up code occurs (without preceding fake Shift-down) +so that a program ignoring e0 would see one more Shift-up +than Shift-down. +

      When NumLock is on, no fake Shifts are sent when Shift was down, +but fake Shifts are sent when Shift was not down. Thus, +with Numlock, if Insert is pressed, +e0 2a e0 52 is sent +and upon release e0 d2 e0 aa is sent. +The keyboard maintains a private NumLock mode, toggled when +NumLock is pressed, and set when the NumLock LED is set. +

      In the same way, when Shift is down, the Grey-/ key produces +fake Shift-up and fake Shift-down sequences. However, it does +not react to the state of NumLock. The purpose of course is to +fool programs that identify Grey-/ with ordinary /, so that they +don't treat Shift-Grey-/ like Shift-/, i.e., ?. +

      On a Toshiba notebook, the three Windows keys are treated like +the group of ten keys mentioned, and get fake shifts when +(left or right) Shift is down. They do not react to NumLock. +

      +

      1.7 Added non-fake shifts +

      + +

      On my 121-key +Nokia Data keyboard there are +function keys F1, ..., F24, where F1, ..., F12 send the expected codes +3b, ..., 58, and F13, ..., F24 send the same codes +together with the LShift code 2a. +Thus, F13 gives 2a 3b on press, +and bb aa on release. +Similarly, there are keys with added LCtrl code 1d. +But there are also keys with added fake shifts e0 2a. +

      +Delorie +reports that the "Preh Commander AT" keyboard with additional F11-F22 keys +treats F11-F20 as Shift-F1..Shift-F10 and F21/F22 as Ctrl-F1/Ctrl-F2; the +Eagle PC-2 keyboard with F11-F24 keys treats those additional keys +in the same way. +

      +

      1.8 Turbo Mode +

      + +

      On some motherboards the LCtrl-LAlt-GreyPlus and LCtrl-LAlt-GreyMinus +switch Turbo mode on/off, respectively. For these, the motherboard +may generate the same scancode sequence when the Turbo button is +pushed: Turbo Switch (High->Low): +1d 38 4a ce b8 9d +and Turbo Switch (Low->High): +1d 38 4e ce b8 9d. +

      Other peculiar combinations in this style include +LCtrl-LAlt-LShift-GreyMinus and LCtrl-LAlt-LShift-GreyPlus to turn +system cache off/on. +

      If Green PC system power saving mode is enabled in AMIBIOS Setup, +the AMI MegaKey keyboard controller recognizes the combinations +Ctrl-Alt-\ (put the system into immediate power down mode), +Ctrl-Alt-[ (disable the Green PC power savings mode temporarily), +Ctrl-Alt-] (enables the Green PC power down mode). +

      Thio Yu Jin <jin@singmail.com> complains that on his Toshiba 4010CDS +the Ctrl-Alt-Shift-T key combination brings up the Toshiba user manual. +(04 Mar 1999 - not April 1.) +

      +

      +

      1.9 Power Saving +

      + +

      +Microsoft recommends: "i8042-based keyboards should deploy the +following scan codes for power management buttons, i.e., POWER and SLEEP +buttons: +

      +

      + Set-1 make/break Set-2 make/break
      +
      +Power e0 5e / e0 de e0 37 / e0 f0 37
      +Sleep e0 5f / e0 df e0 3f / e0 f0 3f
      +Wake e0 63 / e0 e3 e0 5e / e0 f0 5e
      + +
      +

      The Power, Sleep, and Wake event scan codes are the i8042 equivalents +to the System Power Down, System Sleep, and System Wake Up HID usages". +

      Many keyboards have Power/Sleep/Wake keys that have to be +activated by a fourth key (unlabeled, or labeled FN): pressing +one of these four keys does not produce any scancodes, but +when the FN key is pressed simultaneously, the Power/Sleep/Wake +keys give the codes listed above. +

      +

      +

      1.10 Initializing special keyboards +

      + +

      Many keyboards have more keys and buttons than the standard ones. +Sometimes these additional keys produce scancode combinations +that were unused before. But on other keyboard such additional +keys do not produce any code at all, until some initializing +action is taken. +

      Sometimes that action consists of writing some bytes to keyboard +registers. See, for example, the +IBM Rapid Access keyboard, and the +Omnibook keyboard. +

      +

      1.11 Manipulating extra LEDs +

      + +

      Some keyboards have additional LEDs, and in a few cases we know +how to manipulate those. +

      The +Chicony keyboard needs command sequences +eb 00 xy, with +xy = 01 for the Moon LED and +xy = 02 for the zzZ LED. +

      The +IBM EZ Button keyboard needs +command sequences eb 00 xy, with +xy = 01 for the Msg LED, +xy = 02 for the CD LED, +xy = 04 for the Power LED, +xy = 10 for the Talk LED, and +xy = 20 for the Message Waiting LED. +

      The +IBM Rapid Access keyboard needs +command sequences eb 00 xy, with +xy = 04 for the Suspend LED and +xy = 20 for the Mute LED. +

      The +IBM Rapid Access keyboard II needs +the command sequences eb 71 and eb 70 +to switch the Standby LED on and off. +

      The +Logitech Internet Keyboard +has an additional amber LED. It is turned on by sending eb, +and then blinks about once a second. It is turned off again by ec. +

      +

      1.12 The laptop FN key +

      + +

      Laptops have no room for all nonsensical keys one usually find +on a regular keyboard. So, the number pad and other keys are +folded into the main part of the keyboard. A key without label, +or labelled FN is often used to modify the meaning of other keys. +This FN does not produce scancodes itself, it only modifies the +scancodes produced by other keys. +

      + +Neil Brown reports about his Dell Latitude D800 laptop that it has +five key combinations that do not produce proper break codes. +The five combinations FN+F2, FN+F3, FN+F10, FN+Down, FN+Up +(labelled Wireless, Brighter, Darker, Battery, CDEject) +produce make codes e0 08, e0 07, +e0 09, e0 05, e0 06, +respectively. The first three do not produce any break code. +The last two have a break code that is identical to the make code. +

      +


      +Next +Previous +Contents + + diff --git a/specs/kbd/scancodes-10.html b/specs/kbd/scancodes-10.html new file mode 100644 index 0000000..b3916b8 --- /dev/null +++ b/specs/kbd/scancodes-10.html @@ -0,0 +1,805 @@ + + + + + Keyboard scancodes: The AT keyboard controller + + + + + +Next +Previous +Contents +
      +

      10. The AT keyboard controller

      + +

      A user program can talk to the keyboard controller on the motherboard. +The keyboard controller can again talk to the keyboard. +

      When a key is pressed the keyboard sends the corresponding +keyboard scancode to the keyboard controller, and the keyboard controller +translates that and interrupts the CPU, allowing the CPU to read the result. +

      More detailed: when a key is pressed, the keyboard sends +a start bit (low), followed by 8 data bits for the keyboard scancode +of the key (least significant first), followed by an odd parity bit, +followed by a stop bit (high). +The keyboard controller reads the data and checks the parity. +If incorrect, retransmission is requested. If incorrect again +a parity error is reported. +If the time between request to send and start of transmission is greater +than 15 ms, or if the eleven bits are not received within 2ms, +a timeout is reported. +In both cases (parity error or timeout), the data byte is set to 0xff. +

      The keyboard controller has three 8-bit registers involved in +communication with the CPU: its input buffer, that can be written +by the CPU by writing port 0x60 or port 0x64; its output buffer, +that can be read by the CPU by reading from port 0x60; and the +status register, that can be read by the CPU by reading from port 0x64. +

      If the CPU writes to port 0x64, the byte is interpreted as a command byte. +If the CPU writes to port 0x60, the byte is interpreted as a data byte. +

      The keyboard controller has two 8-bit I/O ports involved in +communication with the keyboard: the +input port P1 (receiving input from the keyboard) +and the +output port P2 (for sending output +to the keyboard). +

      +

      10.1 The keyboard controller status register +

      + +

      The keyboard controller has an 8-bit status register. +It can be inspected by the CPU by reading port 0x64. +

      (Typically, it has the value 0x14: keyboard not locked, self-test completed.) +

      +

      +PARE +TIM +AUXB +KEYL +C/D +SYSF +INPB +OUTB
      + +
      +

      Bit 7: + Parity error +

      +

      +0: OK. +1: Parity error with last byte. +
      +

      Bit 6: + Timeout +

      +

      +0: OK. +1: Timeout. +On PS/2 systems: General timeout. +On AT systems: Timeout on transmission from keyboard to keyboard controller. +Possibly parity error (in which case both bits 6 and 7 are set). +
      +

      Bit 5: + Auxiliary output buffer full +

      +

      +On PS/2 systems: +Bit 0 tells whether a read from port 0x60 will be valid. +If it is valid, this bit 5 tells what data will be read from port 0x60. +0: Keyboard data. 1: Mouse data. +

      On AT systems: +0: OK. +1: Timeout on transmission from keyboard controller to keyboard. +This may indicate that no keyboard is present. +

      +

      Bit 4: + Keyboard lock +

      +

      +0: Locked. +1: Not locked. +
      +

      Bit 3: + Command/Data +

      +

      +0: Last write to input buffer was data (written via port 0x60). +1: Last write to input buffer was a command (written via port 0x64). +(This bit is also referred to as Address Line A2.) +
      +

      Bit 2: + System flag +

      +

      +Set to 0 after power on reset. +Set to 1 after successful completion of the keyboard controller self-test +(Basic Assurance Test, BAT). +Can also be set by command (see +below). +
      +

      Bit 1: + Input buffer status +

      +

      +0: Input buffer empty, can be written. +1: Input buffer full, don't write yet. +
      +

      Bit 0: + Output buffer status +

      +

      +0: Output buffer empty, don't read yet. +1: Output buffer full, can be read. +(In the PS/2 situation bit 5 tells whether the available data is +from keyboard or mouse.) +This bit is cleared when port 0x60 is read. +
      +

      +

      10.2 The keyboard controller command byte +

      + +

      The keyboard controller is provided with some RAM, for example 32 bytes, +that can be accessed by the CPU. The most important part of this RAM is +byte 0, the Controller Command Byte (CCB). It can be read/written by +writing 0x20/0x60 to port 0x64 and then reading/writing a data byte +from/to port 0x60. +

      This byte has the following layout. +

      +

      +0 +XLATE +ME +KE +IGNLK +SYSF +MIE +KIE
      + +
      +

      Bit 7: + Unused +

      +

      +Always 0. +
      +

      Bit 6: + Translate +

      +

      +0: No translation. +1: Translate keyboard scancodes, using the +translation table given above. +MCA type 2 controllers cannot set this bit to 1. In this case +scan code conversion is set using keyboard command 0xf0 to port 0x60. +
      +

      Bit 5: + Mouse enable +

      +

      +On an EISA or PS/2 system: 0: Enable mouse. 1: Disable mouse +by driving the clock line low. +On an ISA system: "PC Mode": 0: use 11-bit codes, check parity and do +scan conversion. +1: use 8086 codes, don't check parity and don't do scan conversion. +
      +

      Bit 4: + Keyboard enable +

      +

      +0: Enable keyboard. 1: Disable keyboard +by driving the clock line low. +
      +

      Bit 3: + Ignore keyboard lock +

      +

      +For PS/2: Unused, always 0. +For AT: +0: No action. 1: Force +bit 4 of the status register +to 1, "not locked". This is used for keyboard testing after power on. +Maybe only on older motherboards. +
      +

      Bit 2: + System flag +

      +

      +This bit is shown in +bit 2 of the status register. +A "cold reboot" is one with this bit set to zero. +A "warm reboot" is one with this bit set to one (BAT already completed). +This will influence the tests and initializations done by the POST. +
      +

      Bit 1: + Mouse interrupt enable +

      +

      +On an ISA system: unused, always 0. On an EISA or PS/2 system: +0: Do not use mouse interrupts. +1: Send interrupt request IRQ12 when the mouse output buffer is full. +
      +

      Bit 0: + Keyboard interrupt enable +

      +

      +0: Do not use keyboard interrupts. +1: Send interrupt request IRQ1 when the keyboard output buffer is full. +

      When no interrupts are used, the CPU has to poll bits 0 (and 5) +of the status register. +

      +

      +

      10.3 Keyboard controller commands +

      + +

      The CPU can command the keyboard controller by writing port 0x64. +Useful, generally available, keyboard commands are: +

      +

      +

      + +20 Read keyboard controller command byte
      + +60 Write keyboard controller command byte
      + +aa Self test
      + +ab Interface test
      + +ad Disable keyboard
      + +ae Enable keyboard
      + +c0 Read input port
      + +d0 Read output port
      + +d1 Write output port
      + +e0 Read test inputs
      + +fe System reset
      + +
      +

      Useful, generally available, mouse commands are: +

      +

      +

      + +a7 Disable mouse port
      + +a8 Enable mouse port
      + +a9 Test mouse port
      + +d4 Write to mouse
      + +
      +

      Obscure, probably obsolete, commands: +

      +

      +

      + +00-1f Read keyboard controller RAM
      + +20-3f Read keyboard controller RAM
      + +40-5f Write keyboard controller RAM
      + +60-7f Write keyboard controller RAM
      + +90-93 Synaptics multiplexer prefix
      + +90-9f Write Port13-Port10
      + +a0 Read copyright
      + +a1 Read firmware version
      + +a2 Switch speed
      + +a3 Switch speed
      + +a4 Check if password installed
      + +a5 Load password
      + +a6 Check password
      + +ac Diagnostic dump
      + +af Read keyboard version
      + +b0-b5 Reset keyboard controller line
      + +b8-bd Set keyboard controller line
      + +c1 Continuous input port poll, low
      + +c2 Continuous input port poll, high
      + +c8 Unblock lines P22 and P23
      + +c9 Block lines P22 and P23
      + +ca Read keyboard controller mode
      + +cb Write keyboard controller mode
      + +d2 Write keyboard output buffer
      + +d3 Write mouse output buffer
      + +dd Disable A20 address line
      + +df Enable A20 address line
      + +f0-ff Pulse output bit
      + +
      +

      Command 0x00-0x1f: + Read keyboard controller RAM +

      +

      +(AMIBIOS only) Aliases for 0x20-0x3f. +
      +

      Command 0x20-0x3f: + Read keyboard controller RAM +

      +

      +The last six bits of the command specify the RAM address to read. +The read data is placed into the output buffer, and can be read +by reading port 0x60. +On MCA systems, type 1 controllers can access all 32 locations; +type 2 controllers can only access locations 0, 0x13-0x17, 0x1d, 0x1f. +

      Location 0 is the +Command byte, see above. +

      Location 0x13 (on MCA) is nonzero when a password is enabled. +

      Location 0x14 (on MCA) is nonzero when the password was matched. +

      Locations 0x16-0x17 (on MCA) give two make codes to be discarded +during password matching. +

      +

      Command 0x40-0x5f: + Write keyboard controller RAM +

      +

      +(AMIBIOS only) Aliases for 0x40-0x5f. +
      +

      Command 0x60-0x7f: + Write keyboard controller RAM +

      +

      Command 0x90-0x93: + Synaptics routing prefixes +

      +

      +Prefix a PS/2 mouse command with one of these to talk to one of at most four +multiplexed devices. See also the +multiplexing handshake below. +

      Unfortunately, VIA also uses this command: +

      +

      Command 0x90-0x9f: + Write Port13-Port10 +

      +(VIA VT82C42) Write low nibble to Port13-Port10. +
      +

      Command 0xa0: + Read copyright +

      +

      +On some keyboard controllers: an ASCIZ copyright string +(possibly just NUL) is made available for reading via port 0x60. +On other systems: no effect, the command is ignored. +
      +

      Command 0xa1: + Read controller firmware version +

      +

      +On some keyboard controllers: a single ASCII byte is made available +for reading via port 0x60. +On other systems: no effect, the command is ignored. +
      +

      Command 0xa2: + Switch speed +

      +

      +(On ISA/EISA systems with AMI BIOS) +Reset keyboard controller lines P22 and P23 low. +These lines can be used for speed switching via the keyboard controller. +When done, the keyboard controller sends one garbage byte to the system. +
      +

      Command 0xa3: + Switch speed +

      +

      +(On ISA/EISA systems with AMI BIOS) +Set keyboard controller lines P22 and P23 high. +These lines can be used for speed switching via the keyboard controller. +When done, the keyboard controller sends one garbage byte to the system. +

      (Compaq BIOS: Enable system speed control.) +

      +

      Command 0xa4: + Check if password installed +

      +

      +On MCA systems: +Return 0xf1 (via port 0x60) when no password is installed, +return 0xfa when a password has been installed. +Some systems without password facility always return 0xf1. +

      (On ISA/EISA systems with AMI BIOS) +Write Clock = Low. +

      (Compaq BIOS: toggle speed.) +

      +

      Command 0xa5: + Load password +

      +

      +On MCA systems: +Load a password by writing a NUL-terminated string to port 0x60. +The string is in scancode format. +

      (On ISA/EISA systems with AMI BIOS) +Write Clock = High. +

      (Compaq BIOS: special read of P2, with bits 4 and 5 replaced: +Bit 5: 0: 9-bit keyboard, 1: 11-bit keyboard. +Bit 4: 0: outp-buff-full interrupt disabled, 1: enabled.) +

      +

      Command 0xa6: + Check password +

      +

      +On MCA systems: +When a password is installed: +Check password by matching keystrokes with the stored password. +Enable keyboard upon successful match. +

      (On ISA/EISA systems with AMI BIOS) +Read Clock. 0: Low. 1: High. +

      +

      Command 0xa7: + Disable mouse port +

      +

      +On MCA systems: disable the mouse (auxiliary device) +by setting its clock line low, and set +bit 5 +of the +Command byte. Now P23 = 1. +

      (On ISA/EISA systems with AMI BIOS) +Write Cache Bad. +

      +

      Command 0xa8: + Enable mouse port +

      +

      +On MCA systems: enable the mouse (auxiliary device), +clear +bit 5 of the +Command byte. Now P23 = 0. +

      (On ISA/EISA systems with AMI BIOS) +Write Cache Good. +

      +

      Command 0xa9: + Test mouse port +

      +

      +On MCA and other systems: test the serial link between +keyboard controller and mouse. The result can be read from port 0x60. +0: OK. +1: Mouse clock line stuck low. +2: Mouse clock line stuck high. +3: Mouse data line stuck low. +4: Mouse data line stuck high. +0xff: No mouse. +

      (On ISA/EISA systems with AMI BIOS) +Read Cache Bad or Good. 0: Bad. 1: Good. +

      +

      Command 0xaa: + Self test +

      +

      +Perform self-test. Return 0x55 if OK, 0xfc if NOK. +
      +

      Command 0xab: + Interface test +

      +

      +Test the serial link between keyboard controller and keyboard. +The result can be read from port 0x60. +0: OK. +1: Keyboard clock line stuck low. +2: Keyboard clock line stuck high. +3: Keyboard data line stuck low. +4: Keyboard data line stuck high. +0xff: General error. +
      +

      Command 0xac: + Diagnostic dump +

      +

      +(On some systems) +Read from port 0x60 sixteen bytes of keyboard controller RAM, +and the output and input ports and the controller's program status word. +
      +

      Command 0xad: + Disable keyboard +

      +

      +Disable the keyboard clock line and set +bit 4 +of the +Command byte. +Any keyboard command enables the keyboard again. +
      +

      Command 0xae: + Enable keyboard +

      +

      +Enable the keyboard clock line and clear +bit 4 +of the +Command byte. +
      +

      Command 0xaf: + Read keyboard version +

      +

      +(Award BIOS, VIA) +
      +

      Command 0xb0-0xb5,0xb8-0xbd: + Reset/set keyboard controller line +

      +

      +AMI BIOS: +Commands 0xb0-0xb5 reset a keyboard controller line low. +Commands 0xb8-0xbd set the corresponding keyboard controller line high. +The lines are P10, P11, P12, P13, P22 and P23, respectively. +(In the case of the lines P10, P11, P22, P23 this is on ISA/EISA systems only.) +When done, the keyboard controller sends one garbage byte to the system. +

      VIA BIOS: +Commands 0xb0-0xb7 write 0 to lines P10, P11, P12, P13, P22, P23, P14, P15. +Commands 0xb8-0xbf write 1 to lines P10, P11, P12, P13, P22, P23, P14, P15. +

      +

      Command 0xc0: + Read input port +

      +

      +Read the +input port (P1), +and make the resulting byte available to be read from port 0x60. +
      +

      Command 0xc1: + Continuous input port poll, low +

      +

      +(MCA systems with type 1 controller only) +Continuously copy bits 3-0 of the input port to be read from bits 7-4 +of port 0x64, until another keyboard controller command is received. +
      +

      Command 0xc2: + Continuous input port poll, high +

      +

      +(MCA systems with type 1 controller only) +Continuously copy bits 7-4 of the input port to be read from bits 7-4 +of port 0x64, until another keyboard controller command is received. +
      +

      Command 0xc8: + Unblock keyboard controller lines P22 and P23 +

      +

      +(On ISA/EISA systems with AMI BIOS) +After this command, the system can make lines P22 and P23 low/high +using +command 0xd1. +
      +

      Command 0xc9: + Block keyboard controller lines P22 and P23 +

      +

      +(On ISA/EISA systems with AMI BIOS) +After this command, the system cannot make lines P22 and P23 low/high +using +command 0xd1. +
      +

      Command 0xca: + Read keyboard controller mode +

      +

      +(AMI BIOS, VIA) +Read keyboard controller mode to bit 0 of port 0x60. +0: ISA (AT) interface. +1: PS/2 (MCA)interface. +
      +

      Command 0xcb: + Write keyboard controller mode +

      +

      +(AMI BIOS) +Write keyboard controller mode to bit 0 of port 0x60. +0: ISA (AT) interface. +1: PS/2 (MCA)interface. +(First read the mode using command 0xca, then modify only +the last bit, then write the mode using this command.) +
      +

      Command 0xd0: + Read output port +

      +

      +Read the +output port (P2) +and place the result in the output buffer. +Use only when output buffer is empty. +
      +

      Command 0xd1: + Write output port +

      +

      +Write the +output port (P2). +Note that writing a 0 in bit 0 will cause a hardware reset. +

      (Compaq: the system speed bits are not set. Use commands 0xa1-0xa6 for that.) +

      +

      Command 0xd2: + Write keyboard output buffer +

      +

      +(MCA) +Write the keyboard controllers output buffer with the byte +next written to port 0x60, and act as if this was keyboard data. +(In particular, raise IRQ1 when +bit 0 +of the +Command byte says so.) +
      +

      Command 0xd3: + Write mouse output buffer +

      +

      +(MCA) +Write the keyboard controllers output buffer with the byte +next written to port 0x60, and act as if this was mouse data. +(In particular, raise IRQ12 when +bit 1 +of the +Command byte says so.) +

      Not all systems support this. +

      + Synaptics multiplexing +On the other hand, Synaptics (see +ps2-mux.PDF) +uses this command as a handshake between driver and controller: +if the driver gives this command three times, with data bytes +0xf0, 0x56, 0xa4 respectively, and reads 0xf0, 0x56, but not 0xa4 +back from the mouse output buffer, then the driver knows that the +controller supports Synaptics AUX port multiplexing, and the controller +knows that it does not have to do the usual data faking and goes +into multiplexed mode. The third byte read is the version of the +Synaptics standard. +

      There is a corresponding deactivation sequence, namely +0xf0, 0x56, 0xa5. (And again the last byte is changed to the +version number of the standard supported.) +This latter sequence works both in multiplexed mode and in legacy mode +and can thus be used to determine whether this feature is present +without activating it. +

      See also the multiplexer commands +0x90-0x93. +

      For some laptops it has been reported that bit 3 of every third +mouse byte is forced to 1 (as it would be with the standard +3-byte mouse packets). This may turn 0xf0, 0x56, 0xa4 into +0xf0, 0x56, 0xac and cause misdetection of Synaptics multiplexing +(for version 10.12). +

      +

      Command 0xd4: + Write to mouse +

      +

      +(MCA) +The byte next written to port 0x60 is transmitted to the mouse. +
      +

      Command 0xdd: + Disable A20 address line +

      +

      +(HP Vectra) +
      +

      Command 0xdf: + Enable A20 address line +

      +

      +(HP Vectra) +
      +

      Command 0xe0: + Read test inputs +

      +

      +This command makes the status of the +Test inputs T0 and T1 available +to be read via port 0x60 in bits 0 and 1, respectively. +Use only when the output port is empty. +
      +

      +

      Command 0xf0-0xff: + Pulse output bit +

      +

      +Bits 3-0 of the +output port P2 +of the keyboard controller may be pulsed low for approximately 6 µseconds. +Bits 3-0 of this command specify the output port bits to be pulsed. +0: Bit should be pulsed. +1: Bit should not be modified. +The only useful version of this command is Command 0xfe. +(For MCA, replace 3-0 by 1-0 in the above.) +
      +

      Command 0xfe: + System reset +

      +

      +Pulse bit 0 of the +output port P2 +of the keyboard controller. This will reset the CPU. +
      +

      +

      10.4 The input port P1 +

      + +

      This has the following layout. +

      +

      +bit 7 Keyboard lock 0: locked, 1: not locked
      +bit 6 Display 0: CGA, 1: MDA
      +bit 5 Manufacturing jumper 0: installed, 1: not installed
      + with jumper the BIOS runs an infinite diagnostic loop
      +bit 4 RAM on motherboard 0: 512 KB, 1: 256 KB
      +bit 3   Unused in ISA, EISA, PS/2 systems
      +   Can be configured for clock switching
      +bit 2   Unused in ISA, EISA, PS/2 systems
      +   Can be configured for clock switching
      + Keyboard power PS/2 MCA: 0: keyboard power normal, 1: no power
      +bit 1 Mouse data in Unused in ISA
      +bit 0 Keyboard data in Unused in ISA
      + +
      +

      Clearly only bits 1-0 are input bits. +Of the above, the original IBM AT used bits 7-4, while PS/2 MCA systems +use only bits 2-0. +

      Where in the above lines P10, P11, etc are used, these refer to the pins +corresponding to bit 0, bit 1, etc of port P1. +

      +

      10.5 The output port P2 +

      + +

      This has the following layout. +

      +

      +bit 7 Keyboard data data to keyboard
      +bit 6 Keyboard clock
      +bit 5 IRQ12 0: IRQ12 not active, 1: active
      +bit 4 IRQ1 0: IRQ1 not active, 1: active
      +bit 3 Mouse clock Unused in ISA
      +bit 2 Mouse data Unused in ISA. Data to mouse
      +bit 1 A20 0: A20 line is forced 0, 1: A20 enabled
      +bit 0 Reset 0: reset CPU, 1: normal
      + +
      +

      Where in the above lines P20, P21, etc are used, these refer to the pins +corresponding to bit 0, bit 1, etc of port P2. +

      +

      10.6 The test port T +

      + +

      bit 0 +

      +

      +Keyboard clock (input). +
      +

      bit 1 +

      +

      +(AT) Keyboard data (input). +(PS/2) Mouse clock (input). +
      +

      +


      +Next +Previous +Contents + + diff --git a/specs/kbd/scancodes-11.html b/specs/kbd/scancodes-11.html new file mode 100644 index 0000000..8942da9 --- /dev/null +++ b/specs/kbd/scancodes-11.html @@ -0,0 +1,280 @@ + + + + + Keyboard scancodes: Keyboard commands + + + + + +Next +Previous +Contents +
      +

      11. Keyboard commands

      + +

      One can not only talk to the keyboard controller (by writing to +port 0x64), but also to the keyboard (by writing to port 0x60). +

      In order to avoid interference between scancode sequences or +mouse packets and the reponses given to commands, the keyboard +or mouse should always be disabled before giving a command that +requires a response, and probably enabled afterwards. +Some keyboards or mice do the disable automatically in this +situation, but still require an explicit enable afterwards. +

      Each command (other than 0xfe) is ACKed by 0xfa. +Each unknown command is NACKed by 0xfe. +Some mice expect a corrected byte as reply to the 0xfe, +and will double-NACK with 0xfc when also that is wrong. +

      Here a list with the common commands. +

      +

      +

      +0xed Write LEDs
      +0xee Diagnostic echo
      +0xf0 Set/Get scancode set
      +0xf2 Read keyboard ID
      +0xf3 Set repeat rate and delay
      +0xf4 Keyboard enable
      +0xf5 Set defaults and disable keyboard
      +0xf6 Set defaults
      +0xf7 Set all keys to repeat
      +0xf8 Set all keys to give make/break codes
      +0xf9 Set all keys to give make codes only
      +0xfa Set all keys to repeat and give make/break codes
      +0xfb Set a single key to repeat
      +0xfc Set a single key to give make/break codes
      +0xfd Set a single key to give make codes only
      +0xfe Resend
      +0xff Keyboard reset
      + +
      +

      If the command is preceded by writing 0xd4 to port 0x64, then +it goes to the mouse instead of the keyboard. Common commands: +

      +

      +

      +0xe6 Set mouse scaling to 1:1
      +0xe7 Set mouse scaling to 2:1
      +0xe8 Set mouse resolution
      +0xe9 Get mouse information
      +0xf2 Read mouse ID
      +0xf3 Set mouse sample rate
      +0xf4 Mouse enable
      +0xf5 Mouse disable
      +0xf6 Set defaults
      +0xff Mouse reset
      + +
      +

      +

      11.1 Keyboard command details +

      + +

      +

      Command e8: Nonstandard. Reported to give a +2-byte ID on an +OmniKey keyboard. +

      Command ea: Nonstandard. The sequences +ea 70 and ea 71 are +used by some IBM keyboards to disable and enable extra keys. +

      Command eb: Nonstandard. Sequences involving eb +are often used for +manipulating extra LEDs. +

      Command ec: Nonstandard. On the +IBM Rapid Access keyboard +this command yields a 2-byte ID. +

      Command ed: + Write LEDs +

      +

      +This command is followed by a byte indicating the desired LEDs setting. +Bits 7-3: unused, 0. +Bit 2: 1: CapsLock LED on. +Bit 1: 1: NumLock LED on. +Bit 0: 1: ScrollLock LED on. +When OK, both bytes are ACKed. If the second byte is recognized as a +command, that command is ACKed and done instead. Otherwise a NACK is +returned (and a keyboard enable may be needed). +
      +

      Command ee: + Diagnostic echo +

      +

      +This command returns a single byte, again ee. +
      +

      Command f0: + Set/Get scancode set +

      +

      +Many, but not all, keyboards can be switched to three different +scancode sets. +This command, followed by a byte 01, 02, or 03 +selects the corresponding scancode set. This command, followed by +a zero byte, reads the current scancode set. The reply (translated) +is 43, 41 or 3f, from untranslated 1, 2 or 3. +Note that scancode set 1 should not be translated, while sets +2 and 3 should be translated. +

      Set 2 was introduced by the AT. Set 3 by the PS/2. +

      +

      Command f2: + Read keyboard ID +

      +

      +This command reads a 2-byte +keyboard ID. +XT keyboards do not answer at all (of course), +AT keyboards reply with an ACK (fa) only, +MF2 and other keyboards reply with a 2-byte ID. +Wait at least 10ms after issuing this command. +

      For the mouse reply, see +below. +

      +

      Command f3: + Set repeat rate and delay +

      +

      +A following byte gives the desired delay before a pressed key +starts repeating, and the repeat rate. +

      Bit 7: unused, 0. +

      Bits 6-5: 0, 1, 2, 3: 250, 500, 750, 1000 ms delay. +Default after reset is 500 ms. +

      Bits 4-0: inter-character delay. The number of characters per second +is given by +

      +

      + 0 1 2 3 4 5 6 7
      +0 30.0 26.7 24.0 21.8 20.0 18.5 17.1 16.0
      +8 15.0 13.3 12.0 10.9 10.0 9.2 8.6 8.0
      +16 7.5 6.7 6.0 5.5 5.0 4.6 4.3 4.0
      +24 3.7 3.3 3.0 2.7 2.5 2.3 2.1 2.0
      + +
      +

      (that is, the inter-character delay is (2 ^ B) * (D + 8) / 240 sec, +where B gives Bits 4-3 and D gives Bits 2-0). +

      Default after reset is 10.9 characters per second. +

      Logitech extended commands +Logitech uses escape sequences involving f3 for extended commands. +A Logitech extended command looks like +f3 7f f3 00 f3 xx +(for varying 7-bit values of xx). For example: +

      xx = 01: SendStatus: send the E1 XX codes for SubDeviceType, +BatteryStatus, (Channel if relevant) KbdStatus (=wireless status). +

      xx = 02: OpenLocking +

      xx = 03: CloseLocking +

      xx = 06 f3 aa: +Read byte at address aa (in 0x01-0x1e). +

      xx = 07 F3 aa f3 dd: +Write dd at address aa (in 0x01-0x1e). +

      xx = 10 or 11: Clear all device-related data +in EEPROM and RAM. Now device is disconnected. +

      +

      Command f4: + Keyboard enable +

      +

      +If a transmit error occurs, the keyboard is automatically disabled. +This command re-enables the keyboard and clears its internal 16-byte +buffer. +
      +

      Command f5: + Set defaults and +disable keyboard +

      +

      +Reset keyboard, clear output buffer, switch off LEDs, reset +repeat rate and delay to defaults. Disable the keyboard scan. +
      +

      Command f6: + Set defaults +

      +

      +Reset keyboard, clear output buffer, switch off LEDs, reset +repeat rate and delay to defaults. +
      +

      Command f7: + Set all keys to repeat +

      +

      +Keyboards that support scancode Set 3 keep for each key two bits: +does it repeat? does it generate a break code? +This command sets the "repeat" bit for all keys. +It does not influence keyboard operation when the scancode set is not Set 3. +
      +

      Command f8: + Set all keys to give make/break +codes +

      +

      +This command sets the "generate break code" bit for all keys. +It does not influence keyboard operation when the scancode set is not Set 3. +
      +

      Command f9: + Set all keys to give +make codes only +

      +

      +This command clears the "generate break code" bit for all keys. +It does not influence keyboard operation when the scancode set is not Set 3. +
      +

      Command fa: + Set all keys to repeat +and give make/break codes +

      +

      +This command sets the "repeat" and "generate break code" bits for all keys. +It does not influence keyboard operation when the scancode set is not Set 3. +
      +

      Command fb: + Set some keys to repeat +

      +

      +This command sets the "repeat" bits for the indicated keys. +It is followed by the untranslated Set 3 scancodes of the keys +for which this bit must be set. The sequence is ended by a command +code (ed, ee, f0, f2-ff). +Afterwards, a "keyboard enable" f4 is required. +
      +

      Command fc: + Set some keys to give make/break +codes +

      +

      +This command sets the "generate break code" bits for the indicated keys. +It is followed by the untranslated Set 3 scancodes of the keys +for which this bit must be set. The sequence is ended by a command +code (ed, ee, f0, f2-ff). +Afterwards, a "keyboard enable" f4 is required. +
      +

      Command fd: + Set some keys to give make codes +only +

      +

      +This command clears the "generate break code" bits for the indicated keys. +It is followed by the untranslated Set 3 scancodes of the keys for which +this bit must be set. The sequence is ended by a recognized command code +(such as ed, ee, f0, f2-ff). +Afterwards, a "keyboard enable" f4 is required. +
      +

      Command fe: + Resend +

      +

      +Meant for use by the keyboard controller after a transmission error. +Not for use by the CPU. +
      +

      Command ff: + Keyboard reset +

      +

      +Reset and self-test. +The self-test (BAT) will return aa when OK, and fc otherwise. +As part of the self-test, all LEDs are flashed. +
      +

      +


      +Next +Previous +Contents + + diff --git a/specs/kbd/scancodes-12.html b/specs/kbd/scancodes-12.html new file mode 100644 index 0000000..4530a44 --- /dev/null +++ b/specs/kbd/scancodes-12.html @@ -0,0 +1,502 @@ + + + + + Keyboard scancodes: The PS/2 Mouse + + + + + +Next +Previous +Contents +
      +

      12. The PS/2 Mouse

      + +

      +

      Mice come in various flavours - serial mice, PS/2 mice, busmice, USB mice. +Below a little about mice using the PS/2 protocol, since these also use +the keyboard controller. +

      A mouse has a number of buttons (1-5 is common) and must report +button presses. It has some way of detecting motion, and must report +the amount of movement in the X and Y direction, usually as differences +with the previously reported position, in a (dx,dy) pair. +Touchpads can also report absolute position. +

      Reports come in the form of mouse packets of between 1 and 8 bytes. +Various protocols are in use. +

      +

      12.1 Modes +

      + +

      A PS/2 mouse can be in stream mode (the default). +In this mode it produces a stream of packets indicating mouse movements +and button presses. Or it can be in remote mode. +In this mode the mouse only sends a packet when the host +requests one, using the +eb command. +Finally, it can be in echo ("wrap") mode, +in which everything the host sends is echoed back, until +either a reset (ff) or clear echo mode (ec) +is received. +

      +

      12.2 Scaling +

      + +

      Scaling can be set to 1:1 or 2:1. This affects stream mode only. +In 2:1 scaling: If the unscaled absolute value of dx or dy is 6 or more, +it is doubled. Otherwise, for the unscaled value 0,1,2,3,4,5,6, the +scaled value 0,1,1,3,6,9,12 is sent. +

      +

      12.3 PS/2 mouse protocol +

      + +

      +

      The default protocol

      + +

      The standard PS/2 protocol uses 3-byte packets, as follows: +

      +

      +Yovfl Xovfl dy8 dx8 1 Middle Btn Right Btn Left Btn
      +dx7 dx6 dx5 dx4 dx3 dx2 dx1 dx0
      +dy7 dy6 dy5 dy4 dy3 dy2 dy1 dy0
      + +
      +

      It gives the movement in the X and Y direction in 9-bit two's complement +notation (range -256 to +255) and an overflow indicator. +It also gives the status of the three mouse buttons. +When this protocol is used, the f2 Read mouse ID command +is answered by 00. +

      +

      Intellimouse

      + +

      The Microsoft Intellimouse uses the above protocol until scrolling wheel +mode is activated by sending the magic sequence +f3 c8 f3 64 f3 50 +(set sample rate 200, 100, 80). In this mode, the Read mouse ID command +returns 03, and 4-byte packets are used: +

      +

      +Yovfl Xovfl dy8 dx8 1 Middle Btn Right Btn Left Btn
      +dx7 dx6 dx5 dx4 dx3 dx2 dx1 dx0
      +dy7 dy6 dy5 dy4 dy3 dy2 dy1 dy0
      +dz3 dz3 dz3 dz3 dz3 dz2 dz1 dz0
      + +
      +

      Here the last byte gives the movement of the scrolling wheel in +4-bit two's complement notation (range -8 to +7) and the leading +four bits are just copies of the sign bit. +

      +

      Intellimouse Explorer mouse

      + +

      The Explorer mouse protocol allows for scrolling wheel and five buttons. +It is activated by first sending the magic sequence for Intellimouse, +and then, when the Intellimouse ID has been seen, sending the magic sequence +f3 c8 f3 c8 f3 50 +(set sample rate 200, 200, 80). In this mode, the Read mouse ID command +returns 04, and 4-byte packets are used: +

      +

      +Yovfl Xovfl dy8 dx8 1 Middle Btn Right Btn Left Btn
      +dx7 dx6 dx5 dx4 dx3 dx2 dx1 dx0
      +dy7 dy6 dy5 dy4 dy3 dy2 dy1 dy0
      +0 0 5th Btn 4th Btn dz3 dz2 dz1 dz0
      + +
      +

      Lots of other protocols occur, and only incomplete data is known +about most of them. Some examples. +

      +

      Typhoon mouse

      + +

      The Typhoon optical mouse is reported to send 6-byte packets. +Bytes 1-3 are as for the default PS/2 protocol. +Byte 4 equals byte 1. Byte 5 gives the Z axis movement, one of +ff, 00, 01. Byte 6 is 0. +Of course the idea is that this packet looks like two ordinary packets +and ordinary PS/2 mouse drivers will handle it. +The 6-byte mode is activated by sending the magic sequence +f3 c8 f3 64 f3 50 +f3 3c f3 28 f3 14 +(set sample rate 200, 100, 80, 60, 40, 20). +It is recognized by the ID 08. +

      +

      12.4 Mouse Commands +

      + +

      Every command or data byte sent to the mouse (except for the +resend command fe) is ACKed with fa. +If the command or data is invalid, it is NACKed with fe. +If the next byte is again invalid, the reply is ERROR: fc. +

      +

      Command d0: Read extended ID +

      Read up to 256 bytes. +

      Commands d1-df: Vendor unique commands +

      +

      Command d1: Logitech PS/2++ command +

      This command was to be used, followed by an arbitrary data sequence. +Now replaced by the +sliced commands using +e8. +

      Command e1: Read secondary ID +

      +

      +Replies with two bytes. +An IBM TrackPoint returns 01 as first byte, +and a second byte depending on the model. +
      +

      Command e2: IBM TrackPoint command +

      +

      +Followed by several parameter bytes. For details, see +ykt3dext.pdf. +
      +

      Command e6: + Set mouse scaling to 1:1 +

      +

      +Often ingredient in magic sequences. +
      +

      Command e7: + Set mouse scaling to 2:1 +

      +

      +Often ingredient in magic sequences. +
      +

      Command e8: + Set mouse resolution +

      +

      +This command is followed by a byte indicating the resolution +(0, 1, 2, 3: 1, 2, 4, 8 units per mm, respectively). +It is used in magic sequences to transport two bits, +so that four of these are needed to send a byte to the mouse. +See +below. +
      +

      Command e9: + Status request +

      +

      +This command returns three bytes: +

      First a status byte: +Bit 7: unused, 0. +Bit 6: 0: +stream mode, +1: +remote mode. +Bit 5: 0: disabled, 1: enabled. +Bit 4: 0: scaling set to 1:1, 1: scaling set to 2:1. +Bit 3: unused, 0. +Bit 2: 1: left button pressed. +Bit 1: 1: middle button pressed. +Bit 0: 1: right button pressed. +

      Then a resolution byte: +0, 1, 2, 3: 1, 2, 4, 8 units per mm, respectively. +

      Finally a sample rate (in Hz). +

      See below for special +Synaptics Touchpad handling. +

      +

      Command ea: Set +stream mode +

      +

      Command eb: + Read data +

      +

      +Read a mouse packet. +Needed in +remote mode to ask the mouse for data. +Also functions in +stream mode. +
      +

      Command ec: Clear +echo mode +

      +

      Command ee: Set +echo mode +

      +

      Command f0: Set +remote mode +

      +

      Command f2: + Read mouse ID +

      +

      +(Only supported on some systems.) +This command reads a 1-byte mouse ID. The reply is a single byte 00. +Wait at least 10ms after issuing this command. +

      For the keyboard reply, see +above. +

      BallPoint (trackball) devices return a single byte 02, +Intellimouse returns 03, +Explorer Mouse returns 04, +4d Mouse returns 06, +4dplus Mouse returns 08,as does the Typhoon mouse. +

      +

      Command f3: + Set mouse sample rate +

      +

      +(Only supported on some systems.) +Set mouse sample rate in Hz. +If the given sampling rate is acceptable the ACK is fa. +Otherwise the NACK is fe, and the host can correct. +If it is incorrect again fc is sent. +Correct values are, e.g., 10, 20, 40, 60, 80, 100, 200. +
      +

      Command f4: + Mouse enable +

      +

      +The stream mode mouse data reporting is disabled after a reset and after +the +disable command. This command enables it again. +
      +

      Command f5: + Mouse disable +

      +

      +This stops mouse data reporting in +stream mode. +In stream mode, this command should be sent before sending any other commands. +
      +

      Command f6: + Set defaults +

      +

      +If this command is recognized, a reset is done (set sampling rate 100 Hz, +resolution 4 counts/mm, +stream mode, +disabled, scaling 1:1), but no diagnostics are performed. +For some enhanced mice that require a magic sequence to get into +enhanced mode, this command will reset them to default PS/2 mode. +
      +

      Command fe: Resend +

      +

      +If this command is recognized, the last mouse packet (possibly several bytes) +is resent. There is no ACK to this command, but if the last reply was ACK, +it is sent. +
      +

      Command ff: + Mouse reset +

      +

      +A self-test is performed. When OK, the response is aa 00. +On error, the response is fc 00. +The mouse is reset to default PS/2 mode. +
      +

      +

      12.5 Sliced parameters +

      + +

      For more advanced mouse modes it is necessary to send data to the mouse. +There is now a commonly accepted way. +

      First Logitech tried to use the d1 command followed by an +arbitrary data sequence. +While the IBM specs reserve d1-df for vendor unique commands, +it turns out that not all BIOSes will transmit such codes. +So Logitech drops the d1 and uses the sequence +e8 aa e8 bb e8 cc +e8 dd to transmit the byte aabbccdd, where +aa, bb, cc, dd are 2-bit quantities. +In this way an arbitrarily long sequence of bytes can be transmitted. +

      For synchronization purposes it is possible to separate such groups +of four e8 commands by an e6 command. +Indeed, such separation may be required: Synaptics Touchpads react to +e9 or f3 commands preceded by precisely four +e8 commands. +

      +

      Magic knock

      + +

      For example, the "magic knock" d1 39 db +that sets a device that understands it in PS/2++ mode, +becomes e8 00 e8 03 +e8 02 e8 01 e6 +e8 03 e8 01 +e8 02 e8 03, +abbreviated {E8}0321 {E6} {E8}3123. +Note that 0321 and 3123 do not have repeated symbols. If they had, +too intelligent intermediate hardware transmitting these sequences +might see a superfluous command and suppress it. +

      +

      Magic unknock

      + +

      PS/2++ mode is cleared again by the "magic unknock" +{E8} 0323 or D1 3B from an external device, and +{E8} 0321 or D1 39 from an internal device. +(These commands differ so that in setups where the same commands are +sent to internal and external devices, they can be commanded separately.) +

      For a decription of the PS/2++ format, see +ps2ppspec.htm. +

      +

      12.6 Synaptics Touchpad +

      + +

      A few sketchy details. For nice precise information, get +the +Synaptics interfacing guide. +

      +

      Status request

      + +

      When preceded by an 8-bit request number encoded via four + +e8 +commands, the +e9 status request +returns modified output, somewhat dependent on the Touchpad model. +

      +

      Request 00: Identify Touchpad +

      This request returns three bytes, of which the middle one +is the constant 47. This is the way to recognize +a Touchpad. The low order four bits of the third word contain +the major model version number, the first word contains the +minor version number, and the high order four bits of the +third word contain the (obsolete) model code. +

      +

      Request 01: Read Touchpad Modes +

      This request returns three bytes, of which the first two +are the constants 3b and 47. +The last byte is the mode byte +

      +

      +ABS Rate - - Baud/Sleep DisGest PackSize Wmode
      + +
      +

      Here ABS indicates absolute mode (instead of the default +relative mode). +

      Rate is 0 for 40 packets/sec, 1 for 80 packets/sec. +The PS/2 sampling rate value is ignored. +

      Baud/Sleep indicates the baud rate when used with a serial protocol +(0: 1200 baud, 1: 9600 baud). It must be set whenever ABS or Rate is set. +When used with the PS/2 protocol this bit indicates sleep mode - +a low power mode in which finger activity is ignored and only button +presses are reported. +

      DisGest is the "disable gestures" bit. When set, we have classical +mouse behaviour. When cleared, "tap" and "drag" processing is enabled. +

      PackSize is used for the serial protocol only (and then chooses between +6-, 7- and 8-byte packets, also depending on the Wmode bit). +

      Wmode is used in absolute mode only. When set the packets also +contain the W value. (This value indicates the amount of contact: +0: two-finger contact, 1: three-finger contact, 2: pen contact, +3: reserved, 4-7: ordinary finger contact, 8-15: wide finger or palm contact.) +

      This described Touchpad 4.x. Earlier models had up to four mode bytes. +This request would return mode bytes 1 and 2 in the first and last result byte, +and request 02 would return mode bytes 3 and 4. +

      +

      Request 02: Read Capabilities +

      This request returns three bytes, of which the middle one is +the constant 47. The first and third byte are the high-order +and low-order parts of the capability word. +(Thus on Touchpad 4.x. On earlier models mode bytes 3 and 4 are returned.) +

      This capability word has 16 bits. Bit 15 indicates that capabilities +are supported. Bit 4 indicates that Sleep is supported (for the PS/2 +protocol). Bit 3 indicates that four buttons (Left, Right, Up, Down) +are supported. Bit 1 indicates that multi-finger detection is supported. +Bit 0 indicates that palm detection is supported. +

      +

      Request 03: Read Model ID +

      +

      Request 06: Read Serial Number Prefix +

      +

      Request 07: Read Serial Number Suffix +

      +

      Request 08: Read Resolution +

      +

      +

      Mode setting

      + +

      When preceded by an 8-bit request number encoded via four e8 +commands, the +f3 14 +(set sample rate 20) command sets the mode byte to the +encoded number. (Thus on Touchpads 4.x. Older models have more mode +bytes and several such commands.) +

      +

      +

      12.7 Vendor extensions +

      + +

      There is a complicated forest of "magic sequences" that enable +vendor extensions. Recognizing all of these is a very obscure activity. +

      (Moreover, recognizing these may be counterproductive: +if the mouse has special capabilities which are activated +by a special sequence, and it is connected to the computer +via a KVM switch that does not know about this special protocol, +then switching away and back will leave the mouse in the non-special +state. This leads to non-functioning mice.) +

      A 2002 Logitech file describes the following procedure for recognizing +the mouse type: +

      Stage 1: Send ff: reset. +The reply is ignored. (Most common is aa 00.) +

      Stage 2: Send f3 0a f2: set sample rate +and ask for ID. If the reply is 02, we have a trackball - +it has its own protocol. (The usual reply is 00.) +

      Stage 3: Send e8 00 e6 e6 e6 +e9: set resolution and scaling (three times), and request status. +The reply consists of three bytes s1 s2 s3. +An old-fashioned mouse would report 0 in the second status byte s2 +(since that is the resolution and we just set it). +

      If s2 is nonzero then: s2 is the number of buttons, +s3 is the firmware revision, +s1 has the firmware ID (device type) bits 6-0 in bits 3-0,6-4, +while bit 7 of s1 indicates support for the +e7 e7 e7 e9 command. +

      If s1=d0 and s2=03 and +s3=c8, suspect Synaptics. +

      If s1 and s2 are zero but s3 equals 0a, +suspect Alps. (s3=0a is as expected, but s1=0 +is not) +

      Stage 4: If bit 7 of s1 is set, or if we suspect Alps, +send e8 00 e7 e7 e7 e9: +set resolution and scaling (three times), and request status. +The reply consists of three bytes t1 t2 t3. +Of course, we already know that this is not an old-fashioned mouse. +

      If t2=01 and FirmwareID < 0x10 and +t1 >> 6 = 1, then conclude that we have a +Cordless MouseMan (RA12). +

      If t2=01 and FirmwareID < 0x10 and +t1 >> 6 = 3, then conclude that we have a +Cordless MouseMan (RB24). +

      Other cases with t2=01 are for new cordless mice. +

      If we suspect Synaptics and t2=0 and t3=0a, +then conclude that we have a Synaptics touchpad. +

      If we suspect Alps and t1=33, then conclude that +we have an Alps touchpad. +

      Stage 5: If we don't know the type yet, send f3 c8 +f3 64 f3 50 f2: +Set sampling rate to 200, 100, 80 Hz, and ask for ID. +The reply is a single byte. +If we get 3, conclude that we have an IntelliMouse. +(And this sequence is the initialization sequence for the IntelliMouse.) +

      Stage 6: Send ff: reset. Now the device is no longer in any +special state. +

      Stage 7: If we don't know the type yet, send e8 00 +e8 00 e8 00 e8 00 +e9: set resolution to 0 (four times), and ask for status. +The reply consists of three bytes u1 u2 u3. +If u2=47 and u3=13, then conclude +that we have a new Synaptics touchpad. +

      Stage 7a: At this point we can narrow down to model type. +If the thing is Synaptics or Alps, then Logitech is no longer interested. +If it has 3 buttons, FirmwareID 1 and firmware revision 50, +then conclude that it is a Logitech Mouseman. +

      Stage 8: If we think it is a touchpad, detect whether it has programmable RAM. +Send e6 e8 00 e8 00 e8 +00 e8 00 e9. The reply consists of three +bytes v1 v2 v3. +If v1=06 and v2=00, then conclude +that we have a Touchpad TP3 with programmable RAM. +

      Stage 9: Test whether the device understands the Logitech PS/2++ protocol. +Send the "magic knock" f5 e8 00 e8 +03 e8 02 e8 01 e6 +e8 03 e8 01 e8 02 +e8 03 f4. +Check whether the device replies with an extended report. +

      +


      +Next +Previous +Contents + + diff --git a/specs/kbd/scancodes-13.html b/specs/kbd/scancodes-13.html new file mode 100644 index 0000000..fe45f4c --- /dev/null +++ b/specs/kbd/scancodes-13.html @@ -0,0 +1,79 @@ + + + + + Keyboard scancodes: USB + + + + + +Next +Previous +Contents +
      +

      13. USB

      + +

      The USB specification prescribes 16-bit keycodes for keyboard positions, +identified with key captions for the usual US layout. +Below the values are given in decimal. 0-3 are protocol values, +namely NoEvent, ErrorRollOver, POSTFail, ErrorUndefined, respectively. +The values 224-231 are for modifier keys. +

      +

      +

      + 1 2 3 4 5 6 7 8 9 10 11
      +- err err err A B C D E F G H
      +
      +12 13 14 15 16 17 18 19 20 21 22 23
      +I J K L M N O P Q R S T
      +
      +24 25 26 27 28 29 30 31 32 33 34 35
      +U V W X Y Z 1 2 3 4 5 6
      +
      +36 37 38 39 40 41 42 43 44 45 46 47
      +7 8 9 0 Enter Esc BSp Tab Space - / _ = / + [ / {
      +
      +48 49 50 51 52 53 54 55 56 57 58 59
      +] / } \ / | ... ; / : ' / " ` / ~ , / < . / > / / ? Caps Lock F1 F2
      +
      +60 61 62 63 64 65 66 67 68 69 70 71
      +F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 PrtScr Scroll Lock
      +
      +72 73 74 75 76 77 78 79 80 81 82 83
      +Pause Insert Home PgUp Delete End PgDn Right Left Down Up Num Lock
      +
      +84 85 86 87 88 89 90 91 92 93 94 95
      +KP / KP * KP - KP + KP Enter KP 1 / End KP 2 / Down KP 3 / PgDn KP 4 / Left KP 5 KP 6 / Right KP 7 / Home
      +
      +96 97 98 99 100 101 102 103 104 105 106 107
      +KP 8 / Up KP 9 / PgUp KP 0 / Ins KP . / Del ... Applic Power KP = F13 F14 F15 F16
      +
      +108 109 110 111 112 113 114 115 116 117 118 119
      +F17 F18 F19 F20 F21 F22 F23 F24 Execute Help Menu Select
      +
      +120 121 122 123 124 125 126 127 128 129 130 131
      +Stop Again Undo Cut Copy Paste Find Mute Volume Up Volume Down Locking Caps Lock Locking Num Lock
      +
      +132 133 134 135 136 137 138 139 140 141 142 143
      +Locking Scroll Lock KP , KP = Internat Internat Internat Internat Internat Internat Internat Internat Internat
      +
      +144 145 146 147 148 149 150 151 152 153 154 155
      +LANG LANG LANG LANG LANG LANG LANG LANG LANG Alt Erase SysRq Cancel
      +
      +156 157 158 159 160 161 162 163 164 165166167
      +Clear Prior Return Separ Out Oper Clear / Again CrSel / Props ExSel
      +
      +
      +224 225 226 227 228 229 230 231
      +LCtrl LShift LAlt LGUI RCtrl RShift RAlt RGUI
      +
      + +
      +

      +


      +Next +Previous +Contents + + diff --git a/specs/kbd/scancodes-14.html b/specs/kbd/scancodes-14.html new file mode 100644 index 0000000..ff895cf --- /dev/null +++ b/specs/kbd/scancodes-14.html @@ -0,0 +1,26 @@ + + + + + Keyboard scancodes: Reporting + + + + +Next +Previous +Contents +
      +

      14. Reporting

      + +

      Additions and corrections are welcome. +Use showkey -s to get the scancodes. +Mention keyboard manufacturer and type, and the keycaps. +

      Andries Brouwer - aeb@cwi.nl +

      +


      +Next +Previous +Contents + + diff --git a/specs/kbd/scancodes-2.html b/specs/kbd/scancodes-2.html new file mode 100644 index 0000000..d921c87 --- /dev/null +++ b/specs/kbd/scancodes-2.html @@ -0,0 +1,182 @@ + + + + + Keyboard scancodes: Special keyboards - XT keyboards + + + + + +Next +Previous +Contents +
      +

      2. Special keyboards - XT keyboards

      + +

      First keyboards with an XT interface. +There is no keyboard controller, no commands to the keyboard. +On a modern computer these will usually yield "keyboard error" +or "KB/interface error" or some such, but sometimes they can be +used nevertheless. +

      The IBM PC (all models) and the IBM XT (models 68, 78, 86, 87, 88, +267, 277) came with this 83-key keyboard. +The IBM AT (models 68, 99, 239, 319) came with an 84-key keyboard. +The IBM XT (models 89, 268, 278, 286) and the IBM AT model 339 +came with a 101-key keyboard. +

      The original IBM 83-key PC/XT keyboard did not have LEDs. +The original IBM 84-key AT keyboard has LEDs, separates the +keypad from the main area, moves the Esc key to the right, +and adds the SysReq key. +The original IBM 101-key keyboard moves the ten function keys +from the left to the top row and adds two more. The Esc key is moved +in front of this row of function keys. The "number" and "cursor" +functions of the keypad are separated. There are duplicate Ctrl and Alt +keys. +

      +

      2.1 XT keyboard +

      + +

      The +XT keyboard +has 83 keys, nicely numbered 1-83, that is, with scancodes +01-53. No escaped scancodes. +

      +

      + + +
      +

      +

      2.2 Victor keyboard +

      + +

      This +Victor keyboard +is very similar. The keypad is separated here, and the Esc key +has been moved to the keypad. The frontside of the ScrollLock key +says Break. It resembles an AT keyboard but has only 83 keys, +the SysRq is still missing. +

      +

      + + +
      +

      +

      2.3 Olivetti M24 keyboard +

      + +

      +

      + + +
      + +The Olivetti M24 (also sold under the names Logabax 1600 and +ATT PC-6300) was an IBM compatible manufactured in 1984. +

      John Elliott writes: +The Olivetti M24 is an XT sort-of clone. It +has two possible keyboards - the normal (83-key) IBM one, +and a "deluxe" one (102 keys) with 18 function keys. +

      Unlike a normal XT keyboard, it is possible to send commands to it. +The BIOS does this twice: +(1) Command 01h makes the keyboard perform a self-test. +(2) Command 05h makes the keyboard return a 1-byte ID. The least signficant +bit is set for a "deluxe" layout. +

      The keyboard connector is DE-9 rather than DIN. Pins are: +

      +1   KBDATA
      +2   KBCLOCK
      +3   GND
      +4   GND
      +5  +12V
      +6   -RESET1
      +7   Keyboard/-Typewriter
      +8   TEST0
      +9   +5V
      +
      + +(pins 6-9 are not used by the supplied keyboards). +

      Attached +the diagram +of the 'deluxe' keyboard, which shows its scancodes in decimal. +

      A mouse can be attached to the keyboard. The following is based +on disassembling attmouse.drv from Windows 1.0. +

      Windows initialises the mouse by sending the following bytes to the +keyboard: 0x12, 0x77, 0x78, 0x79, 0x00. +The 0x12 is almost certainly a command byte; 0x77, 0x78 and 0x79 are the +scancodes to be returned by the three mouse buttons. I don't know what the +0x00 is for. +

      It then handles the following scancodes: +0xFE -- mouse movement. The next two scancodes are delta X, then delta Y, +in ones' complement. +0x77, 0x78, 0x79 (and 0xF7, 0xF8, 0xF9) -- button presses / releases. +

      When shutting down the mouse, it sends these bytes to the keyboard: +0x11, 0x1C, 0x53, 0x01, 0x4B, 0x4D, 0x48, 0x50, 0x02, 0x04. +My guesses here are: +0x11: Mouse movement becomes simulated keypresses. +0x1C, 0x53, 0x01: Scancodes to be returned by mouse button presses. +0x4B, 0x4D, 0x48, 0x50: Scancodes to be returned by mouse movement. +0x02, 0x04: Don't know. +

      +

      2.4 Telerate keyboard +

      + +

      The +Telerate keyboard was used +for financial applications, as is clear from the keycaps. +This keyboard (in the old XT version, without e0 prefixes) +has four additional keys, with scancodes 61, +62, 63, 64. The F11 and F12 keys have +scancodes 54 and 55 (instead of the common 57 +and 58). There are two LEDs (for CapsLock and NumLock). +

      +

      + + +
      +

      +

      2.5 NCR keyboard +

      + +

      Also with an XT interface this +NCR keyboard, +still with ten function keys on the left, but already with a separate +block of keys between the ordinary keys and the numeric keypad. +This middle block has on top five keys +Ctrl (1d, same as the Ctrl on the left), +Del (53, same as Keypad-Del/.), +PgUp (49, same as Keypad-9/PgUp), +End (4f, same as Keypad-1/End), +PgDn (51, same as Keypad-3/PgDn), and below five cursor keys +(48, same as Keypad-8/Up; +4b, same as Keypad-4/Left; +47, same as Keypad-7/Home; +4d, same as Keypad-6/Right; +50, same as Keypad-2/Down). +Enter and Keypad-enter are both 1c. +Below the Enter key PrtScn/* (37), and below that again +Ins (52, same as Keypad-0/Ins). +CapsLock and NumLock have a built-in LED. +

      +

      + + +
      +

      +

      +

      2.6 Cherry G80-0777 +

      + +

      According to +FreeKEYB/kbdinfo.html +this keyboard has five additional keys with scancodes +55 (F11), 56 (F12), +57 (F13), 58 (F14), 59 (F15). +

      +

      +


      +Next +Previous +Contents + + diff --git a/specs/kbd/scancodes-3.html b/specs/kbd/scancodes-3.html new file mode 100644 index 0000000..fdc5f60 --- /dev/null +++ b/specs/kbd/scancodes-3.html @@ -0,0 +1,64 @@ + + + + + Keyboard scancodes: Special keyboards - Amstrad/Schneider keyboards + + + + + +Next +Previous +Contents +
      +

      3. Special keyboards - Amstrad/Schneider keyboards

      + +

      Since IBM had patented their keyboard design, +Amstrad developed an entirely different keyboard. +

      +

      3.1 Amstrad/Schneider PC1512 +

      + +

      The +Amstrad keyboard +is entirely incompatible with XT and AT keyboards, and can be used only +on an Amstrad; conversely, no other keyboard will work on an older Amstrad. +This keyboard has a Del key on the keypad, and both Del-> and Del<- keys +above the Enter key. The Del-> key has scancode 70. +Left of the Enter key a PrtSc/* key. +There is an additional Enter key with scancode 74. +It is possible to connect a mouse and/or joystick to the keyboard, +and then these devices also yield scancodes: +77 (joystick button 1), 78 (joystick button 2), +79 (joystick right), 7a (joystick left), +7b (joystick up), 7c (joystick down), +7d (mouse right), 7e (mouse left). +

      +

      + + +
      +

      +

      3.2 Amstrad/Schneider other models +

      + +

      John Elliott adds: +

      The above only mentions the PC1512/PC1640 style of keyboard. +Later Amstrad XTs (PPC512, PPC640, PC20, PC200, PC2086, PC3086) used a +102-key keyboard with the same layout and scancodes as a normal 102-key XT +keyboard. This design is not only incompatible with normal XT and AT +keyboards, it's also incompatible with the PC1512 keyboard. The joystick +socket is no longer present, but mouse button clicks are still handled by +the keyboard, with the same scancodes 7d (right button) and +7e (left button). +

      On the PPC512, PPC640, PC20 and PC200, the keyboard is in the same box as +the motherboard, and is connected directly to it by ribbon cable. +

      +

      +


      +Next +Previous +Contents + + diff --git a/specs/kbd/scancodes-4.html b/specs/kbd/scancodes-4.html new file mode 100644 index 0000000..7c058e6 --- /dev/null +++ b/specs/kbd/scancodes-4.html @@ -0,0 +1,41 @@ + + + + + Keyboard scancodes: Special keyboards - AT keyboards + + + + + +Next +Previous +Contents +
      +

      4. Special keyboards - AT keyboards

      + +

      The AT keyboard adds a keyboard controller. +The numeric keypad is now separated from the main keyboard. +There is a single new key, with scancode 84 = 54, +namely SysRq. +

      The protocol for AT and later keyboards differs from that for +XT keyboards. Some old keyboards have an XT/AT switch on the +backside that selects the appropriate protocol. +Other keyboard autodetect XT or AT mode. +

      +

      + + +
      +

      +

      The KeyTronic KB101-1 keyboard has four switches of which the first two +indicate the desired behaviour (00 - autodetect, 01 - unused, +10 - PC/XT, 11 - AT). Autodetect does not always work. +

      +

      +


      +Next +Previous +Contents + + diff --git a/specs/kbd/scancodes-5.html b/specs/kbd/scancodes-5.html new file mode 100644 index 0000000..ed71bbc --- /dev/null +++ b/specs/kbd/scancodes-5.html @@ -0,0 +1,1411 @@ + + + + + Keyboard scancodes: Special keyboards - MF II keyboards + + + + + +Next +Previous +Contents +
      +

      5. Special keyboards - MF II keyboards

      + +

      Next the modern keyboards. (MF stands for MultiFunctional.) +The layout has changed: the function keys now form a top row. +Function keys F11 and F12 were added. The ten keypad digit keys +that served dual purposes (depending on NumLock and Shift) +were duplicated so that digits and cursor movements could be +produced without help from the Shift or Numlock keys. +Also the Alt and Ctrl keys were duplicated. +Prefixes e0 and e1 were introduced +to distinguish old and new versions of the same old key. +All modern keyboards follow this scheme, but many add a messy +collection of "internet buttons" and "CD keys". +

      Let us group keyboards according to manufacturer. +

      +

      5.1 Compaq keyboards +

      + +

      +

      +

      Compaq Armada laptop keyboard

      + +

      Christian Gennerat <christian.gennerat@vz.cit.alcatel.fr> writes: +There are 4 extra keys on the Compaq Armada laptops. +The four keys are located over the Esc-F1..F12, and are labelled *1-*4. +Scancodes: 65, 67, 69, 6b. +

      +

      Compaq Easy Accesss Internet Keyboard

      + +

      Petr Slansky <slansky@usa.net> writes: +

      Internet buttons: +e0 13 online community button (people icon), +e0 14 online Compaq button (Q icon), +e0 15 online services button (bulb icon), +e0 1e online e-mail button (envelope icon), +e0 21 online Search button (magnifier icon), +e0 23 online start button (i icon), +e0 32 online commerce button (shopping basket icon), +

      e0 68 Quick Print button (printer icon), +e0 1f Favorite Application Launch button (racket icon), +

      e0 5f Sleep button, +

      CD/DVD player buttons: +e0 22 Play/Pause, +e0 24 Stop, +e0 19 Next Track, +e0 10 Previous Track, +e0 2c Eject, +

      Volume Control buttons: +e0 30 Volume increase (+), +e0 2e Volume decrease (-), +e0 20 Mute. +

      +

      + + +
      +

      +

      Compaq Eight-Button Easy Access Keyboard

      + +

      A +Compaq keyboard that I have here, +has the usual setup (with Windows keys) plus a top row of eight buttons, +that produce scancodes +e0 23, +e0 1f, +e0 1a, +e0 1e, +e0 13, +e0 14, +e0 15, +e0 1b. +These keys do not produce any codes in scan code Set 3. +

      +

      + + +
      +

      +

      5.2 IBM keyboards +

      + +

      +

      IBM Rapid Access keyboard

      + +

      + +(Information from Dennis Bjorklund <dennisb@cs.chalmers.se> +and others.) +

      The IBM Rapid Access keyboard has 14 extra buttons and two more leds +than a normal PC keyboard. By default, these buttons do not generate +any scancodes. To activate them one has to send the sequence +ea 71 to the keyboard. +Once that is done the extra keys generate normal e0xx sequences. +To turn off the extra keys you send ea 70. +

      These 14 keys send the following scancodes (when activated): +

      e0 25 (Suspend), +e0 26 (Help), +e0 32 (Prg 1), +e0 17 (Prg 2), +e0 30 (Prg 3), +e0 2e (Prg 4), +e0 19 (Play CD), +e0 24 (CD Stop), +e0 22 (CD Pause), +e0 1e (Vol -), +e0 20 (Vol +), +e0 23 (Prev song), +e0 21 (Next song), +e0 12 (Mute). +

      +

      The Suspend and Mute buttons have extra LEDs on them. +Sending the sequence + +eb 00 ff +to the keyboard makes all five LEDs lit up for a moment. +The sequence eb 00 04 lights the Suspend LED +(behind a waning moon). +The sequence eb 00 20 makes the Mute LED blink. +The sequence eb 00 80 locks the keyboard; +if the Mute LED was blinking it now is lit permanently. +Sending eb 00 ff unlocks the keyboard again. +

      The command ec returns 0c 01 (untranslated) +which becomes 3e 43 in translated scancode Set 2. +(Possibly an ID?) +

      +

      + +Dennis Bjorklund writes: +Here is the hack I use to send commands to the keyboard. After you have +compiled it you can do things like send_to_keyboard ea 71, +but don't run two of these at the exact same moment, and don't send +strange codes because the keyboard might lock up. +

      My computer runs this at every startup. After that the extra buttons on +the rapid access work just fine in XFree86. +

      +
      +/* gcc -O2 -s -Wall -osend_to_keyboard main.c */
      +#include <stdlib.h>
      +#include <unistd.h>
      +#include <sys/io.h>
      +
      +int main(int argc, char *argv[]) {
      +  int i;
      +
      +  ioperm(0x60, 3, 1);
      +
      +  for (i = 1; i < argc; i++) {
      +    int x = strtol(argv[i], 0, 16);
      +
      +    usleep(300);
      +    outb(x, 0x60);
      +  }
      +
      +  return 0;
      +}
      +
      +
      +

      +

      + + +
      +

      +

      IBM Rapid Access II keyboard

      + +

      +

      This keyboard has a top row of seven color-coded buttons. +On the upper right a "wheel" composite button with six parts. +Below it a blue button ("mute"). +Finally, the usual block with four arrow keys has been enlarged +by two more keys ("page left" and "page right"). +

      Keys: +

      e0 25 (Green, "Internet"), +e0 26 (Blue, "Internet shopping"), +e0 32 (Yellow, "IBM Web support"), +e0 17 (Purple), +e0 30 (Red), +e0 2e (Cyan, "Help"), +e0 5f (White, "Standby" - has a LED), +e0 20 (CD stop), +e0 22 (CD play), +e0 21 (Volume D), +e0 23 (Volume U), +e0 24 (CD back), +e0 12 (CD fwd), +e0 1e (Mute - no LED). +

      (In translated scancode Set 3, these become +41, 3f, 3d, 3b, 3c, +66, --, 69, 6a, 6b, +6c, 6d, 44, 68, respectively.) +

      The "back" ("page left") and "forward" ("page right") keys +generate ALT+left and ALT+right respectively: +38 e0 4b (release sequence +b8 e0 cb) and +38 e0 4d. +

      The commands ea 70 and ea 71 +serve to switch off (resp. on) the special keys. +(These are on by default, but can be switched off.) +However, the white Standby key is always on. +

      The white Standby button has a LED (that is flashed during a reset). +It is set by the command + +eb 71 +and cleared by the command eb 70. +

      +

      +

      + + +
      +

      +

      IBM ThinkPad

      + +

      George Staikos <staikos@0wned.org> writes: +

      I have an IBM ThinkPad i1460. It has the IBM EasyLaunch<tm> keys. +These are four multicoloured keys up at the top of the keyboard +for "Home Page", "Search", "Shop", "Mail". They dont' seem to create +any keyboard events at all. The keyboard interrupt doesn't trigger, +showkeys doesn't see them do anything, and in DOS, a simple +sequence of BIOS calls doesn't see them either. +Also, being a laptop, it has an FN key. This key generates 55. +

      +

      5.3 Logitech keyboards +

      + +

      +

      Logitech Internet keyboard

      + +

      Jonathan DeBoer <deboer@ugrad.cs.ualberta.ca> reports: +This keyboard has 18 unusual keys. +

      e0 7a (WWW), +e0 32 (History), +e0 21 (Open URL), +e0 23 (Home), +38 2a 0f 8f (key press) +8f b8 aa (key release) (Send To Back) - +this sequence simulates Alt+Shift+Tab, but contains two Tab releases, +e0 17 (Print), +e0 10 (Back), +e0 22 (Forward), +e0 24 (Stop), +e0 19 (Refresh), +e0 1e (Search), +e0 12 (Find), +e0 26 (Add Favourite), +e0 18 (Open Favourites), +e0 20 (Hot Links), +e0 30 (Scroll Up), +e0 2e (Scroll Down), +e0 25 (Logitech). +

      +

      Ryan Lortie <desertangel@globalserve.net> writes: +The "Logitech" key is used as a modifier. +In windows, Logitech-Keypad+ increases volume, Logitech-Keypad- decreases. +There is a conjoined dual-button key for "scroll". +You press the top part to scroll up, the bottom to scroll down. +

      +

      Graham Hay adds: The extra LED is an amber colour, placed above +the www key with a recessed line linking them. Sending eb alone +turns it on. It will flash on/off about once per second after that. +A single ec will turn it off. +

      +

      + + +
      + +(enlarge)

      +

      +

      Logitech Cordless Desktop Pro keyboard

      + +

      Nick Rusnov <nick@grawk.net> reports: +

      The special buttons on a Logitech Cordless Desktop Pro keyboard +produce the following scancodes: +

      e0 5f (Moon (sleep)), +e0 32 (Homepage), +e0 6c (Mail), +e0 65 (Search), +e0 66 (runningguuy), +e0 20 (Mute), +e0 2e (VolDown), +e0 30 (VolUp), +e0 22 (Play/Pause), +e0 24 (Stop), +e0 10 (Rewind), +e0 19 (ff), +e0 21 (Logitech). +

      +

      Logitech Access keyboard

      + +

      Denis Kosygin <kosygin@math.princeton.edu> reports: +

      In addition to usual 104 keys in the usual PC layout this keyboard +has 11 extra keys. Ten of them produce the following escape scancodes: +e0 5f (User (moon)), +e0 6c (E-mail), +e0 11 (Messenger/SMS), +e0 12 (Webcam), +e0 20 (Mute (crossed speaker)), +e0 30 (VolUp (triangle up with + sign in it)), +e0 2e (VolDown (triangle down with - sign in it)), +e0 6d (Media), +e0 32 (My Home), +e0 65 (Search). +

      The eleventh key (with keycap "F lock") is a switch between two sets +of scancodes for function keys F1-F12. When "F lock" is pressed, then +F1-F12 act as function keys and produce usual keyscans for these keys. +When "F lock" is depressed, F1-F12 generate the following keyscans: +

      e0 3b (new [F1]), +e0 3c (reply [F2]), +e0 3d (forward [F3]), +e0 3e (send [F4]), +e0 10 (rewind [F5]), +e0 19 (fast forward [F6]), +e0 22 (play/pause [F7]), +e0 24 (stop [F8]), +e0 43 (my com [F9]), +e0 44 (my doc [F10]), +e0 57 (my pic [F11]), +e0 58 (my music [F12]). +

      +

      + + +
      +

      +

      +

      Logitech Cordless Desktop Optical keyboard

      + +

      Stefan reports: +

      The special buttons on a Logitech Cordless Desktop Optical keyboard +produce the following scancodes: +

      e0 69 (Go), +e0 6a (Back), +e0 5f (Sleep), +e0 66 (Favorites), +e0 24 (SeekBack), +e0 22 (SeekForward), +e0 01 (Media), +e0 1e (VolUp), +e0 25 (VolDown), +e0 26 (Mute), +e0 1f (PlayPause), +e0 17 (Stop), +e0 6c (Email), +e0 65 (Search), +e0 02 (Homepage). +

      Some other keys behave differently. +

      +

      +

      5.4 Microsoft keyboards +

      + +

      +

      Some common scancodes found on some Microsoft keyboards. +

      +

      +

      +e0 05 Messenger or Files e0 07 Redo (on F3 or not) e0 08 Undo (on F2 or not) e0 09 Application Left
      +e0 0a Paste e0 0b/8b Scroll Up/Down Normal e0 10 Prev Track, |<< e0 11/91 Scroll Up/Down Fast
      +e0 12/92 Scroll Up/Down Faster e0 13 Word e0 14 Excel e0 15 Calendar
      +e0 16 Log Off e0 17 Cut e0 18 Copy e0 19 Next Track, >>|
      +e0 1e Application Right e0 1f/9f Scroll Up/Down Fastest e0 20 Mute e0 21 Calculator
      +e0 22 Play/Pause e0 23 Spell (on F10) e0 24 Stop (cf e0 68) e0 2e Volume -
      +e0 30 Volume + e0 32 Web/Home e0 3b Help (on F1) e0 3c My Music or Office Home (on F2)
      +e0 3d Task Pane (on F3) e0 3e New (on F4) e0 3f Open (on F5) e0 40 Close (on F6)
      +e0 41 Reply (on F7) e0 42 Fwd (on F8) e0 43 Send (on F9) e0 57 Save (on F11)
      +e0 58 Print (on F12) e0 5b LeftWindows e0 5c RightWindows e0 5d Application (Menu)
      +e0 5e Power e0 5f Sleep e0 63 Wake e0 64 My Pictures
      +e0 65 Search e0 66 Favorites e0 67 Refresh e0 68 Stop (cf e0 24)
      +e0 69 Forward e0 6a Back e0 6b My Computer e0 6c Mail
      +e0 6d Media
      + +
      +

      +

      +

      Microsoft Natural keyboard

      + +

      This keyboard has three additional keys, with escaped scancodes +e0 5b (LeftWindow), +e0 5c (RightWindow), +e0 5d (Menu). +The untranslated Set 2 scancodes (see +below) +are e0 1f, e0 27 and +e0 2f, respectively. +The USB key codes are usage page 0x07, usage index 227, 231, 101 +(decimal), respectively. +Microsoft +describes +the intended use in detail. Both Windows keys are intended to be +used as modifier keys, like both shift and control and alt keys. +The Menu key may be modified by shift etc. +

      +

      Microsoft Internet keyboard

      + +

      In addition to the three extra keys on the Microsoft Natural keyboard, +this keyboard has ten keys, with escaped scancodes +e0 6a (Back), +e0 69 (Forward), +e0 68 (Stop), +e0 6c (Mail), +e0 65 (Search), +e0 66 (Favorites), +e0 32 (Web/Home), +e0 6b (My Computer), +e0 21 (Calculator), +e0 5f (Sleep). +The untranslated Set 1 codes are as expected (make codes identical to +the above translated Set 2 ones). The translated Set 3 codes are +6a, 69, 68, 6c, 65, +66, 97, 6b, 99, 54, +respectively. +

      +

      Microsoft Natural keyboard pro

      + +

      Marco Melgazzi <marco@techie.com> reports: +The Microsoft Natural keyboard pro has 19 additional keys, +with escaped scancodes +e0 6a (Back), +e0 69 (Forward), +e0 68 (Stop), +e0 67 (Refresh), +e0 65 (Search), +e0 66 (Favorites), +e0 32 (Web/Home), +e0 6c (Mail), +e0 20 (Mute), +e0 2e (Volume -), +e0 30 (Volume +), +e0 22 (Play/Pause), +e0 24 (Stop), +e0 10 (Prev Track), +e0 19 (Next Track), +e0 6d (Media), +e0 6b (My Computer), +e0 21 (Calculator), +e0 5f (Sleep). +(That is, we have the ten extra keys of the Microsoft Internet keyboard, +with the same scancodes, and also Refresh, Mute, Volume -, Volume +, +Play/Pause, Stop, Prev Track, Next Track, Media.) +

      +

      Microsoft Natural Multimedia Keyboard

      + +

      Jeremy Brand <jeremy@nirvani.net> reports: +The Microsoft Natural Multimedia Keyboard has 17 additional keys. +Scancodes are +

      ? (My Documents), +e0 64 (My Pictures), +e0 3c (My Music), +e0 20 (Mute), +e0 22 (Play/Pause), +e0 24 (Stop), +e0 30 (Volume +), +e0 2e (Volume -), +e0 10 (|<<), +e0 19 (>>|), +e0 6d (Media), +e0 6c (Mail), +e0 32 (Web/Home), +e0 05 (Messenger), +e0 21 (Calculator), +e0 16 (Log Off), +e0 5f (Sleep). +

      Moreover, the function keys are dual purpose. +There is a "function lock" key. +By default the function keys are not function keys, they are +"Help", "Undo", etc. You have to press the function lock key +and then the function keys act like the usual function keys. +In the default state the scancodes are +

      e0 3b (Help) on F1 key, +e0 08 (Undo) on F2 key, +e0 07 (Redo) on F3 key, +? (New) on F4 key, +? (Open) on F5 key, +? (Close) on F6 key, +? (Replay) on F7 key, +e0 42 (Fwd) on F8 key, +e0 43 (Send) on F9 key, +e0 23 (Spell) on F10 key, +e0 57 (Save) on F11 key, +e0 58 (Print) on F12 key. +

      +

      +

      Microsoft Office keyboard

      + +

      Christian Hammond +reports +about the keyboard Scroll Wheel: +The following is my interpretation of the results of +showkey -s. I had read that the wheel has 3 speeds, +normal, fast, and faster. However, my results show 4. +

      Scroll Up: Normal e0 0b, +Fast e0 11, +Faster e0 12, +Fastest e0 1f. +

      Scroll Down: Normal e0 8b, +Fast e0 91, +Faster e0 92, +Fastest e0 9f. +

      Wouter van Wijk <woutervanwijk@netscape.net> reported the scancodes +given below. +

      On the left touchpad above the scroll wheel: +e0 6a (Back), +e0 69 (Forward). +On the left touchpad below the scroll wheel: +e0 17 (Cut), +e0 18 (Copy), +e0 0a (Paste), +e0 09 (Application Left), +e0 1e (Application Right), +

      Buttons on the top row: +No scancode (F Lock), +e0 13 (Word), +e0 14 (Excel), +e0 32 (Web/Home), +e0 6c (Mail), +e0 15 (Calendar), +e0 05 (Files), +e0 21 (Calculator), +e0 20 (Mute), +e0 2e (Volume -), +e0 30 (Volume +), +e0 16 (Log Off), +e0 5f (Sleep). +This is the expected code for Sleep. However, there do not seem to be +Power and WakeUp keys. +

      The twelve function keys can be in two states. In the default state +they produce the (new) codes below. The FLock toggle switches them +back to good old function key state. +e0 3b (Help [F1]), +e0 3c (Office Home [F2]), +e0 3d (Task Pane [F3]), +e0 3e (New [F4]), +e0 3f (Open [F5]), +e0 40 (Close [F6]), +e0 41 (Reply [F7]), +e0 42 (Fwd [F8]), +e0 43 (Send [F9]), +e0 23 (Spell [F10]), +e0 57 (Save [F11]), +e0 58 (Print [F12]). +Note that each of these codes is just the e0 variation +of the ordinary function key code, except for that for Spell [F10]. +When the FLock light is off (default) the e0-version +is activated. +

      Above the 5-key block with Insert, Home, Delete, PgUp, PgDown: +e0 08 (Undo), +e0 07 (Redo). +

      Above the number pad: +59 (=), +e0 4c (( [PrintScreen]), +e0 64 () [ScrollLock]), +0e (Backspace), +0f (Tab). +These are the usual codes for Backspace and Tab but new codes +for (, ), =. PrintScreen and ScrollLock have the usual codes. +

      +

      + + +
      + +See the +Microsoft ad. +

      +

      5.5 Safeway keyboards +

      + +

      +

      +

      Safeway SW10 keyboard

      + +

      The Safeway SW10 keyboard has the usual keys, including the three +Windows keys, and including Power, Sleep, Wake keys +(below Delete, End, PageDown) that do not produce scancodes +unless the Fn key (above Keypad-Minus) is pressed simultaneously. +This Fn key is used together with 11 keys: F1-F7, F11, Power, Sleep, Wake. +Fn-F11 disables the keyboard and another Fn-F11 enables it again. +Fn-F1/F2/F3/F4/F5/F6/F7 sets the repeat rate +(on my keyboard I measured 2.0/4.0/6.7/12/26/32/32 chars/sec respectively). +

      +

      Safeway SW23 keyboard

      + +

      The Safeway SW23 keyboard has 132 keys: the usual 104 keys +(101 plus three Windows keys), five more keys called Turbo +(below Enter, right of RShift), and Power, Sleep, Wake +(below Delete, End, PageDown), and Ez (above Keypad-Minus), +and 23 buttons in two rows above the row of function keys. +By default, the five extra keys do not produce scancodes. +(The Ez is a mode toggle. The Turbo key is used to enable +the Power, Sleep, Wake keys.) +

      First row of buttons: three Volume buttons: +e0 58 (Mute), +e0 5a (Vol -), +e0 70 (Vol +), +five CD Player buttons: +e0 59 (Prev), +e0 42 (Play), +e0 69 (Next), +e0 64 (Stop), +e0 71 (Eject), +two Recorder buttons: +e0 40 (Rew/Play), +e0 29 (Rec/Stop). +

      Second row of buttons: +e0 23 (Sleep), +e0 7d (Cut), +e0 7e (Copy), +e0 7f (Paste), +e0 20 (Rotate), +e0 43 (Close), +e0 30 (My Doc), +e0 44 (DOS), +e0 79 (Game), +e0 77 (WWW), +e0 6e (Calc), +e0 3e (X'fer), +e0 6a (Menu/?). +

      The Ez key does not produce scancodes, but toggles a +M/Mode LED, the fourth next to the Num, Caps, Scroll LEDs. +When that LED is set, the 17 keypad keys give different +scancodes: +e0 3c (N/Lock), +e0 7b (/), +e0 22 (*), +e0 61 (-), +e0 0f (7), +e0 21 (8), +e0 6b (9), +e0 3d (+), +e0 04 (4), +e0 62 (5), +e0 39 (6), +e0 10 (1), +e0 24 (2), +e0 05 (3), +e0 02 (0), +e0 41 (.), +e0 3f (Enter). +

      The Turbo key does not produce scancodes, and neither do +Power, Sleep, Wake. However, when Turbo is pressed simultaneously, +the Power, Sleep, Wake keys yield e0 5e, +e0 5f, e0 63 as +they should. +

      In untranslated scancode mode 3, the multimedia and power keys +do not yield any code. In untranslated scancode mode 1 they +yield the same code as in untranslated scancode mode 2. +(This is a design bug: untranslated scancode mode 1 should be the same +as translated scancode mode 2 (see +below), +and this is true for the ordinary keys, but fails here for the +"multimedia" keys. For example, the keys End and Keypad-Minus +(in M/Mode) yield the same e0 4f in +untranslated scancode mode 1.) +

      Note that some "protocol keycodes" occur here with e0 prefix. +Indeed, we see e1, ee, f1, fe, ff +in the key up sequence for the multimedia keys Keypad-Minus +(e0 e1), Calc (e0 ee), +Eject (e0 f1), Copy (e0 fe), +Paste (e0 ff). +

      +

      5.6 Internet Wireless Keyboard +

      + +

      This keyboard (nameless, made in China) has 9+1+9 buttons, +nine on each side of the Sleep button. +Buttons: +e0 6a (Web Backward), +e0 69 (Web Forward), +e0 68 (Web Stop), +e0 67 (Web Refresh), +e0 65 (Web Search), +e0 66 (Web Favorites), +e0 32 (Web Home), +e0 6c (E-mail), +e0 20 (Mute), +e0 5f (Sleep), +e0 2e (Volume Down), +e0 30 (Volume Up), +e0 22 (Play/Pause), +e0 24 (Stop), +e0 10 (Fast Backward), +e0 19 (Fast Forward), +e0 6d (Media Player), +e0 6b (My Computer), +e0 21 (Calculator). +

      This keyboard reports +keyboard ID +ab 83 (translated ab c1). +Scancode sets 1 and 2 are reported as 01 and 02 +(translated c3 and c1). +These translations are bugs, but otherwise all seems to function +as expected, except that this keyboard does not recognize +scancode set 3 and returns fe for an attempt to set Set 3. +Every command ed xx is accepted, but there are no LEDs, +there is only a battery indicator. +

      The mouse that accompanies the keyboard shows no reactions. +It may need a special driver. +

      +

      5.7 Nokia keyboard +

      + +

      This 121-key +Nokia keyboard +has ten function keys on the left and twenty-four on +the two top rows. On the right a block with cursor keys +and a block with numeric keys. There are three LEDs. +The keys have brown markings, and sometimes also blue ones. +Where both occur, the blue markings describe the usual PC keytops. +

      Roughly speaking, the scancodes are as expected. +The +function keys F1-F10,F11,F12 +have scan codes 3b-44, 57, 58 as usual. +The keys on the upper row, labeled F13-F24, yield the same codes as +shifted F1-F12. E.g., F13 gives 2a 3b on press, +and bb aa on release. +The function keys F4,F11,F13-F19,F21,F24 have front labels +CrSel, AltCr, Red, Pink, Green, Yellow, Blue, Turq, White, +Col, USM. +

      The +ten keys on the left +have the following scancodes. +First column of five: +01 (Attn/Esc/NxtTsk), as expected for Esc; +1d 3b (Quit/Reset), as expected for Ctrl F1; +1d 3c (ExSel), as expected for Ctrl F2; +1d 3d (Ident/Print), as expected for Ctrl F3; +1d 3e (Help/EnlW), as expected for Ctrl F4. +For these last four keys (and the ChgSc/WSCtrl below) the code +becomes 3b-3e (and 3f) when left or right +Ctrl is pressed already. +Second column of five: +e1 1d 45 ((Break)/Clear/Pause/Test), and e0 46 +with Ctrl, as expected for Pause/Break; +46 (ScrLock), as expected for ScrLock; +e0 2a e0 37 (PrtSc/SysRq), and e0 37 with +left or right Ctrl or left or right Shift, and 54 +with left or right Alt, as expected for PrtSc; +1d 3f (ChgSc/WSCtrl), as expected for Ctrl F5; +38 e0 49 (Jump), as expected for Alt PgUp. +

      On +the right a cursor key +section and a number pad. +The cursor key section has the expected block of six: +e0 52 (Dup/Insert/PA1); +e0 47 (Field Mark/Home/PA2); +e0 49 (PA3/PgUp); +e0 53 (Delete/DelWd); +e0 4f (ErEOF/End/ErInp); +e0 51 (PgDn). +Next four arrow keys: +e0 48 (Up); +e0 4b (Left); +e0 4d (Right); +e0 50 (Down). +And in the middle 1d 40 (Home), with code as expected for Ctrl F6. +

      Finally the numeric keypad, with the usual keys that generate the +usual codes, and a single additional key, a Tab, with 0f +like the ordinary tab. +

      +

      + + +
      +

      +

      5.8 Focus KeyPro FK-9000 keyboard +

      + +

      Raul D. Miller <rockwell@nova.umd.edu> +and Timothy C. Hagman <hagmanti@cps.msu.edu> +report: +

      The keyboard is a KeyPro FK-9000. The FCC label says it's made in +Taiwan by Focus Electronic Co, Ltd. It has a built-in calculator. +

      This keyboard has twelve additional keys, with scancodes +55 (PF1), +6d (PF11), +6f (PF12), +73 (PF2), +74 (PF9), +77 (PF3), +78 (PF4), +79 (PF5), +7a* (PF6), +7b (PF7), +7c (PF8), +7e* (PF10). +

      The break codes equal the make codes ORed with 0x80, as always, +but the Linux kernel eats fa and fe as +protocol bytes. +

      The behavior of these keys is different from that of normal keys-- +they generate nothing when pressed; then generate the above scancodes +at the normal repeat time and rate, and then generate (except for the +starred ones) their scancode ORed with 0x80 when released... +

      These PF keys are reprogrammable -- and programming occurs as a sequence +of keyboard actions. Therefore, the PF keys duplicate whatever +keyboard actions occurred during their programming. +You hit the "Prog" key, then the PF key you want to program; type the +string you want to store in the key (it's limited to 14 keypresses), +and then hit the PF key again. After that, when you hit the PF key, +it sends the string, and generates its own abnormal scancode upon +release. When the key is held down, it generates the scancode repeatedly, +but does not generate the string stored in it repeatedly. +

      When you go to program a key, the scancodes for "PF##-" are sent +to the computer, then the scancodes for each key you hit as you +hit it (the shift, etc. keys are an exception-- they send "s-" +and such :), and then, when you hit the PF## key again to end the +programming, it sends a sequence of (at least) 18 "0e 8e"s -- +Backspaces... +

      The program key itself doesn't generate a scancode at any time. +The same applies to the CE and AC/ON keys (part of the calculator). +There is a switch to change between calculator and keyboard mode +which generates no scancodes. +

      When the keyboard is in calculator mode, the entire numeric +keypad (and everything else on the right side) generates no +scancodes. +

      When the keyboard is not in caluclator mode, the %, MC, MR, M-, +M+, and Square Root keys all generate ff when pressed, +ff to repeat, and ff on release. +

      The little unlabeled key between the right Ctrl and right Alt +generates 56 when hit, repeats that, and then d6 +when released, just like a normal key. +

      +

      +

      5.9 BTC keyboard +

      + +

      This keyboard has one additional key, with escaped scancode +e0 6f (Macro). (Funny enough it does this +in all modes, each of the three scancode sets, translated or not. +In particular, this Macro key is the only key that generates +two bytes in scancode mode 3.) +

      +

      5.10 LK411 and LK450 keyboards +

      + +

      These keyboards have seven additional keys, with escaped scancodes +e0 0f (LeftCompose), +e0 3d (F13), +e0 3e (F14), +e0 3f (Help), +e0 40 (Do), +e0 41 (F17), +e0 4e (Keypad-minplus). +(LK411 has all seven. LK450 has the last six - the report did not +mention a Compose key.) +There are only two LEDs. The keycaps are unusual. +

      In (translated) scancode Set 3 these keys give codes +68, 44, 42, 40, +3e, 65, 70. +In untranslated Set 2, the F17 key gives e0 83. +

      An +LK411 keyboard, +with +left +and +right hand side enlarged. +

      The keys labeled F18, F19, F20 produce the codes expected for +PrtSc, ScrollLock, Pause. +The keys labelled PF1, PF2, PF3, PF4 produce the codes expected for +NumLock, Keypad-/, Keypad-*, Keypad--. +The Keypad-, key produces the code 4e expected for Keypad-+. +The Right ComposeCharacter key produces the code expected for RCtrl. +The key labelled </> produces the code 29 +expected for `/~. The key labelled with `/~/(Esc) produces +the code expected for Esc. +

      +

      + + +
      +

      +

      5.11 An OmniKey keyboard +

      + +

      This keyboard has one additional key, with escaped scancode +e0 4c (Omni). +

      For the Northgate OmniKey 101 keyboard it is said that the command +e8 reads a 2-byte ID. +

      +

      5.12 GRiD 2260 keyboard +

      + +

      The GRiD 2260 notebook has a key producing the +6c scancode; I do not know the keycap. +

      +

      5.13 An old Olivetti keyboard +

      + +

      Kasper Dupont <kasperd@daimi.au.dk> writes: +My 10 year old 102-key keyboard that came with an "Olivetti PCS 286" +actually has connectors for three additional keys just bellow Delete, End, +and PgDn. There is no keys on the connectors, I only found them because I +opened the keyboard for cleaning. The scancodes are from left to right +65, 66, 67. +

      +

      5.14 Cherry G81-3000 +

      + +

      According to +Delorie +the "Cherry G81-3000 SAx/04" keyboard has four additional keys, +which can be made available by a user modification; +the three new keys located directly below the cursor pad's +Delete, End, and PgDn keys send make codes 66-68 (F19-F21); +the fourth new key, labeled (delta), sends make code 73. +

      +

      5.15 Accord keyboard +

      + +

      According to +Delorie +the "Accord" +ergonomic keyboard +with optional touchpad has an additional key above the Grey-Minus key +marked with a left-pointing triangle and labeled "Fn" in the owner's +booklet which sends make code e0 68. +

      +

      5.16 Trust Ergonomic keyboard +

      + +

      Frank v Waveren <fvw@var.cx> reports: +The Trust Ergo Track keyboard has one additional key (`application key'), with +escaped scancode e0 68. The keycap is a triangle pointing left. +

      +

      5.17 Brazilian keyboards +

      + +

      ABNT (Associação Brasileira de Normas Tecnicas) and ABNT2 +are Brazilian keyboard layout standards. The plain Brazilian +keyboard has 103 keys. +

      The Brazilian ABNT keyboard has two unusual keys, +with scancodes 73 (/?) and 7e (Keypad-.). +The former is located to the left of the RShift (which +key therefore is less wide than usually), the latter below +the Keypad-Plus (reducing the Keypad-Plus to single height). +

      Under Linux, the corresponding key codes are 89 and 121, respectively. +These keys do not function with Windows NT 4.0. +

      Antonio Dias <accdias@sst.com.br> provided the +keypad layout +and writes: Brazilian ABNT2 keyboards come with two layouts. +In MSDOS they call them ID 274 and ID 275. +

      +

      5.18 RC930 keyboard +

      + +

      Torben Fjerdingstad <tfj@olivia.ping.dk> reports: +

      It's an rc930 keyboard, from Regnecentralen/RC International, Now ICL. +This keyboard has four additional keys, with scancodes +59 (A1), +5a (A2), +5b (A3), +5c (A4). +

      The rc930/rc931 keyboards are not made anymore, because they had a +problem with fast typists, writing over 400 chars/minute. +Writing 'af<space>', very, very fast, did a PgUp. +

      +

      5.19 Tandberg Data keyboard +

      + +

      Kjetil Torgrim Homme <kjetilho@ifi.uio.no> reports: +

      My Tandberg Data keyboard uses the prefix 80 for +its numerous (20) extra keys. The 80 scancodes are: +

      11, 12, 13, 14, 16, +17, 18, 19, 1e, 1f, +20, 21, 22, 23, 25, +26, 2f, 30, 32, 56. +

      For completeness, the e0 scancodes: +

      1c, 2a, 35, 37, 47, +48, 49, 4b, 4d, 4f, +50, 51, 52, 53. +

      The e1 scancode: 1d. +As you can see, there is no overlap on this keyboard. +

      Harald Arnesen <gurre@start.no> gives the keycaps +for these for the Tandberg TDV5020 keyboard. +All use prefix 80 on both press and release. +

      Thirteen keys have (Norwegian) text: +11 HJELP (help), 14 STRYK (cut), +16 KOPI (copy), 17 FLYTT (move), +19 JUST (justify), 21 MERK (mark), +22 ANGRE (undo), 23 SKRIV (print), +25 SLUTT (exit), 26 FELT (field), +2f AVSN (paragraph), 30 SETN (sentence), +and 32 ORD (word). +

      Seven keys have symbols: 12 /\/\/\ (insert soft hyphen), +13 [Crossed down-arrow] (move down five lines), +18 >> << (justify left/right), +1e <> >< (justify full/center), +1f |<- (backtab), +20 ->| (tab), and +56 [Back/down arrow] (start new paragraph). +

      Other keycaps also occur. Those given above were meant +for use with the Notis WP word processor. +

      +

      5.20 Host Connected keyboard +

      + +

      IBM makes the "Host Connected Keyboard" for PS/2 machines used as +3270 emulators. +Delorie +reports on the 122-key "Host Connected" keyboard. +It may have 5b (F13), 5c (F14), 5d (F15), +63 (F16), 64 (F17), 65 (F18), +66 (F19), 67 (F20), 68 (F21), +69 (F22), 6a (F23), 6b (F24). +

      +

      5.21 A nameless USB keyboard +

      + +

      This keyboard has four additional keys: Power (rose), Sleep (blue), +WakeUp (green) and FN (yellow). +In legacy mode these keys give the expected keycodes +(e0 5e, e0 5f, e0 63, +and none, respectively), but the interaction is funny. +The four keys act as radiobuttons. Pressing one yields its key down code, +but releasing it does not produce any scancodes. Now pressing another +yields the down code for the other followed by the up code for the +previous one. The FN key follows this pattern, only its scancode sequence +is empty. Thus, pressing it causes the release code for a previous key +to be emitted. Pressing a key a second time gives no reaction: the radiobutton +was down already. +

      +

      5.22 Omnibook keyboard +

      + +

      + +The HP Omnibook XE3 laptop has special multimedia keys (aka OneTouch buttons) +disabled by default. It is enabled by writing 0x59 to port 0x64 +and then 0x90 to port 0x60 (as was found by Pavel Mihaylov). +Various kernel patches can be found on the net. See, for example, +this one. +

      Keys (on a GF model): +

      e0 32 (WWW), +e0 6c (Mail), +e0 74 (Demo), +e0 73 (Help), +e0 10 (Previous Track), +e0 22 (Play / Pause), +e0 24 (Stop / Eject), +e0 19 (Next Track), +e0 2e (Volume Down), +e0 30 (Volume Up), +e0 20 (Mute / Unmute). +

      +

      +

      +

      5.23 EZ Button keyboard +

      + +

      Eric Schott <eric@morningjoy.com> writes: +

      I have an IBM EZ Button keyboard (US layout), which seems to +generate codes that are similar - but not identical - to the +Rapid Access keycodes listed above. +

      There are 14 additional keys: +

      e0 25 ("Power" moon - has an LED), +e0 26 ("Help"), +e0 32 ("Internet"), +e0 17 ("Lotus Word Pro"), +e0 30 ("Lotus Organizer"), +e0 2e ("Aptiva Installer"), +e0 19 ("Delete Message"), +e0 24 (Stop), +e0 22 (Pause), +e0 1e ("Msg" - has an LED), +e0 20 ("CD" - has an LED), +e0 23 (Rewind), +e0 21 (Fast Forward), and +e0 12 ("Talk" - has an LED). +

      +

      The LEDs in the buttons are controlled by the sequence + +eb 00 xx +where the xx controls the LEDs. Bit 0 controls the "Msg" LED, +1 the CD LED, 2 the Power LED, 4 the Talk LED, and 5 the Message +Waiting LED. +

      +

      +

      5.24 Chicony KBP-8993 keyboard +

      + +

      Matthijs Melchior <mmelchio@xs4all.nl> reports: +

      The Chicony KBP-8993 keyboard is similar. It has 14 additional +keys, enabled by sending ea 71 and disabled +by sending ea 70. +

      These keys generate the following scan codes: +

      e0 25 (Moon), +e0 32 (WWW), +e0 30 (DOS), +e0 17 (MyDoc), +e0 26 (Menu), +e0 1e (zzZ), +e0 2e (Close), +e0 24 (Stop), +e0 23 (Back), +e0 22 (Play), +e0 21 (Forward), +e0 20 (Mute), +e0 12 (VolDown), +e0 19 (VolUp). +

      The two extra LEDs, above the Moon key, and next to the zzZ key +are manipulated by sending: + +eb 00 0x, +where bit 0 is the Moon LED and bit 1 is the zzZ LED. +

      +

      5.25 Keyboards for HP Kayak and Vectra +

      + +

      Fons Rademakers <Fons.Rademakers@cern.ch> writes: +

      The electronics for this keyboard was first developed by HP's +Home Products Division (HPD). +They now make improved versions, which I don't know much about. +We (HP Corporate PC Divisions, in Grenoble) reused the electronics, +and changed the serigraphy printed on the keys. +

      +

      +
      +MsgTTlWWW ? Lck MsgPhnWWWxxxSlp 133134135136137
      +PhnS3 S4 S5 i <<>||[] >> HP 138139140141142
      + Mut Mut 143
      + Vl+ Vl+ 144
      + VL- VL- 145
      + +
      Grenoble keyboard ------- Old HPD keyboard -------- key numbers
      +

      +

      +

      + Key# Scancode Gren. Name HPD name ASCII
      +
      + 133 e0 1e Message/SC1 Message a
      + 134 e0 12 Top Tools Phone e
      + 135 e0 32 Web Browser Internet m
      + 136 e0 17 Reminder Shortcut i
      + 137 e0 25 Lock Suspend k
      + 138 e0 23 Phone/SC2 << h
      + 139 e0 22 ShortCut 3 >|| g
      + 140 e0 24 ShortCut 4 [] j
      + 141 e0 21 ShortCut 5 >> f
      + 142 e0 26 Information Information l
      + 143 e0 20 Mute Mute d
      + 144 e0 30 Volume + Volume + b
      + 145 e0 2e Volume - Volume - c
      + +
      +

      Note the scancodes above are those read by x86 software in port 0x60. +This is also called Scancode Set 1. +Break codes are the same, with bit 7 of the second scancode set. +Example: e0 9e for the Message key. +

      +

      <spikboll@gmx.net> adds: +These keyboards have a "mail LED" (it's positioned above the Message +button) that kan be controlled by the Rapid Access hack: +'send_to_keyboard eb' makes the led blink and +'send_to_keyboard ec' turns the led off. +'send_to_keyboard ed' makes the led light steadily +and locks up the keys. +

      +

      5.26 A keyboard +

      + +

      Jon Masters <jonathan@easypenguin.co.uk> writes: +

      My new 121 key keyboard has 105 keys + 16 multimedia keys +(including cool stuff like a volume jog dial that sends one scancode +when turned one way and anther when turned the opposite way). +

      e0 5e (Power Off), +e0 5f (Sleep), +e0 63 (Resume), +e0 2e (Help), +e0 20 (My Favourite), +e0 30 (Browser), +e0 32 (WWW Search), +e0 26 (Shortcut), +e0 25 (Volume Down), +e0 1e (Volume Up), +e0 12 (Mute), +e0 22 (Previous), +e0 10 (Stop), +e0 24 (Next), +e0 21 (Eject), +e0 19 (Play). +

      +

      5.27 Yahoo! keyboard +

      + +

      Bernhard Polzin <B.Polzin@web.de> writes: +

      I have a transparent violet colored "Yahoo!" Keyboard with extra keys +for Internet and Audio. Unusual scancodes (untranslated/translated): +

      e0 37 / e0 5e (Power), +e0 3f / e0 5f (Sleep), +e0 5e / e0 63 (Wake), +e0 21 / e0 2e (Y!), +e0 4b / e0 26 (Short Cut), +e0 3a / e0 32 (E-Mail), +e0 23 / e0 20 (My Doc), +e0 32 / e0 30 (WWW), +e0 1c / e0 1e (Volume +), +e0 42 / e0 25 (Volume -), +e0 24 / e0 12 (Mute), +e0 15 / e0 10 (Stop), +e0 4e / e0 0c (Play/Pause), +e0 34 / e0 22 (Prev Track), +e0 3d / e0 08 (Next Track), +e0 4d / e0 19 (Eject). +(Volume +), (Volume -), (Prev Track) and (Next Track) are typematic. +

      Note that this is very similar to the previous one. +

      +

      + + +
      +

      +

      5.28 Honeywell Multimedia Keyboard +

      + +

      Eric Yeo reports that his Honeywell Multimedia Keyboard has the following +additional keys: +e0 25 (Screen saver), +e0 24 (Mail), +e0 32 (WWW), +e0 10 (Game), +e0 26 (Calc), +e0 1e (Shortcut 1), +e0 18 (Shortcut 2), +e0 12 (Prev), +e0 22 (Next), +e0 19 (Play), +e0 23 (Stop), +e0 30 (Vol up), +e0 2e (Vol down), +e0 17 (Eject), +e0 20 (Mute). +

      +

      5.29 Samsung Ergonomics Keyboard +

      + +

      Miguel Costa reports that his +Samsung Ergonomics Keyboard has the following additional keys: +e0 2e (Vol down), +e0 30 (Vol up), +e0 20 (Mute), +e0 18 (Eject), +e0 22 (PlayPause), +e0 24 (Stop), +e0 10 (Rewind), +e0 19 (Forward), +e0 26 (Help), +e0 59 (Favorites), +e0 09 (Exit), +e0 0a (Address book), +e0 02 (Action 1), +e0 03 (Action 2), +e0 04 (Action 3), +e0 05 (Action 4), +e0 06 (Action 5), +e0 32 (Internet), +e0 6c (Email), +e0 5f (Standby), +e0 5b (Windows left), +e0 5c (Windows right), +e0 5d (Windows task). +

      +

      + + +
      +

      +

      5.30 The "LiteOn MediaTouch Keyboard" type SK-2500 +

      + +

      Serge van den Boom reports that his LiteOn MediaTouch Keyboard +(a Trust "Direct Access Keyboard"), has 18 additional keys: +e0 25 (Suspend), +e0 7a (Coffee), +e0 32 (WWW), +e0 21 (Calculator), +e0 23 (Xfer), +38 2a 0f 8f / 8f b8 +aa (Switch window), +e0 17 (Close), +e0 10 (|<<), +e0 22 (>| / []), +e0 24 ([]), +e0 19 (>>|), +e0 1e (Record), +e0 12 (Rewind), +e0 26 (Menu/?), +e0 18 (Eject), +e0 20 (Mute), +e0 30 (Volume +), +e0 2e (Volume -). +Of these, the keys (|<<), (>>|), (Volume +), (Volume -) repeat. +The others do not, except for the rather special (Switch window) +key. Upon press it produces the LAlt-down, LShift-down, Tab-down, +Tab-up sequence; it repeats 0f, that is, Tab-down; +and upon release it produces the Tab-up, LAlt-up, LShift-up sequence. +

      +

      + + +
      +

      +

      +

      5.31 The Acer Aspire 1310LC laptop +

      + +

      Pau Aliagas reports that his Acer Aspire 1310LC laptop has 4 +additional keys: +e0 6c (Mail), +e0 32 (WWW), +e0 74 (P1), +e0 73 (P2). +

      +

      +

      5.32 The Emachines eKB-5190(A) keyboard +

      + +

      This keyboard has 18 additional keys, with translated Set 2 scancodes: +e0 1e (Banking), +e0 25 (Brokerage), +e0 26 (Pay Bills), +e0 24 (News), +e0 21 (Sports), +e0 22 (Travel), +e0 32 (Shopping), +e0 23 (Tickets), +e0 31 (Music), +e0 18 (Health), +e0 30 (Greetings), +e0 1f (Games), +e0 13 (Auctions), +e0 2e (MySite), +e0 20 (Telephone), +e0 12 (Surf), +e0 19 (Search), +e0 10 (Vol -), +e0 17 (Vol +). +The respective untranslated Set 3 codes are +95, 9d, 9c, 94, 99, +93, 97, 9a, 9e, 9f, +91, a3, a2, 92, 9b, +96, a0, a1, 98 (equal to the +translated Set 3 codes). +

      Unusual commands are e4 0b, which returns +bc 1c (untranslated 06 f0 5a), +and e4 0c, which returns +ff (untranslated 00), +and ec 0c, which returns 06 regardless of +translation. I do not know the meaning or function of these. +

      +

      5.33 Keyboards with many keys +

      + +

      The current mechanism is unable to handle keyboards with more than +127 keys. But such keyboards seem to exist. Indeed, I now have a +Safeway SW23 that has 132 keys. +

      Mark Hatle <fray@kernel.crashing.org> wrote: +

      On some ADB keyboards there are actually 128 distinct keys. +They use scancodes 0-127. +

      ADB is Apple Desktop Bus. The way that ADB works is similar to SCSI but +on a much slower level. Specifically there is a communications chip in +the computer, ADB controller, and the same chip in the keyboard. The +keyboard sends the scancode to its internal ADB controller, the internal +ADB controller then does any key mapping needed (not used under linux +from my understanding) and passes the data to the computer. +

      The ADB controller is capable of sending 256 distinct keys, but to my +knowledge only 128 are sent. The key 0 is the 'a' and key 127 is the +"power button". +

      Also some of the Apple ADB keyboards have special "sound" and "function" +keys. These keys (used in MacOS for volume up and down, screen contrast +changing, etc) also show up on the ADB scancodes. +

      ADB is used for both m68k and PPC Linux. The m68k Macintosh port, and +the PPC - Power Macintosh and CHRP ports. +

      and later: +

      Basically the scancode sequences for ADB are 16 bit. so there can actually +be 65536 scancodes, currently though only 128 are defined. +

      +

      5.34 A keyboard treating PrtSc/SysRq like Pause/Break +

      + +

      + +Mike A. Harris <mharris@meteng.on.ca> +reports a keyboard (an "Mtek" keyboard, model "K208") +where PrtSc/SysRq behaves like Pause/Break and also sends both make +and break sequences when pressed and nothing when released. +It does not repeat. +(Thus, he gets e0 2a e0 37 +e0 b7 e0 aa for PrtSc press, +and 54 d4 for SysRq (i.e., Alt+PrtSc).) +Others have reported the same (for an unspecified type of keyboard). +

      +


      +Next +Previous +Contents + + diff --git a/specs/kbd/scancodes-6.html b/specs/kbd/scancodes-6.html new file mode 100644 index 0000000..32f8c4c --- /dev/null +++ b/specs/kbd/scancodes-6.html @@ -0,0 +1,304 @@ + + + + + Keyboard scancodes: NCD keyboards + + + + + +Next +Previous +Contents +
      +

      6. NCD keyboards

      + +

      Some keyboards natively produce +Set 3 scancodes. +When connected to a PC one will by default see translated Set 3 scancodes. +This means that the F9 and F10 keys have make codes 60 and 61 +and break codes e0 and e1. Thus, these latter codes are +ordinary key release codes here, not protocol codes. +

      The N-nnn type numbers indicate the number nnn of keys the keyboard has. +

      +

      6.1 A Japanese keyboard using e0 as ordinary scancode +

      + +

      Benjamin Carter <bcarter@ultra5.cs.umr.edu> reports: +

      I recently came into possession of a 97-key keyboard with Japanese +markings on the keys. (The keys also have the standard +qwerty-characters on them, with the exception of some of the meta-keys +(there are 3 keys near the Alt keys on either side of the spacebar with +only Japanese characters on them so I don't know what they are). +In any case, the keyboard sends out scancodes that work for all the main +keys (backspace, letters and numbers, enter, shift), but the numeric +keypad, Alt keys, and function keys don't work. +I have run the board through showkey -s, so I know what +scancodes this keyboard sends out. +However, the F9 and F10 keys send out 60 and 61, +respectively, so their key release events send out e0 +and e1, confusing the keyboard driver. +

      (Compare this with the +table +giving the translated Set 3 scancodes. The reported codes are +almost identical.) +

      # These are across the top of the keyboard. +

      58 (F1), 59 (F2), 5a (F3), +5b (F4), 5c (F5), 5d (F6), +5e (F7), 5f (F8), 60 (F9), +61 (F10), 62 (F11), 63 (F12) +

      +76 (Break), 77 (Setup). +

      +# top row +

      64 (Esc), +02 (1), 03 (2), 04 (3), +05 (4), 06 (5), 07 (6), +08 (7), 09 (8), 0a (9), +0b (0), 0c (-), 0d (=), +29 (`), 0e (Backspace) +

      +

      # 2nd row +

      0f (Tab), +10 (Q), 11 (W), 12 (E), +13 (R), 14 (T), 15 (Y), +16 (U), 17 (I), 18 (O), +19 (P), 1a ([), 1b (]), +79 (Del), 6e (Line Feed) +

      +

      # 3rd row +

      38 (Ctrl), +1e (A), 1f (S), 20 (D), +21 (F), 22 (G), 23 (H), +24 (J), 25 (K), 26 (L), +27 (;), 28 ('), 75 (\), +1c (Return) +

      +

      # 4th row +

      2a (Shift_L), +2c (Z), 2d (X), 2e (C), +2f (V), 30 (B), 31 (N), +32 (M), 33 (,), 34 (.), +35 (/), +3a ((unknown)), +36 (Shift_R) +

      +

      # bottom row +

      1d (Caps Lock), 71 (Alt_L), +01 ((unknown)), +39 (Space), +45 ((unknown)), +72 (Alt_R), +46 ((unknown)) +

      +

      # numeric keypad. No "grey" section on the keyboard. +

      47 (7), 48 (8), 49 (9), +54 (Keypad -), +4b (4), 4c (5), 4d (6), +37 (Keypad +), +4f (1), 50 (2), 51 (3), +4e (Keypad Enter), +52 (0), +78 (Up), +53 (Keypad .), +56 (Left), +55 (Down), +7d (Right), +7e (Keypad ,). +

      +

      +

      6.2 The NCD N-123NA keyboard +

      + +

      +

      + + +
      +

      There are more keyboards that do not use e0 as escape code. +For example, Paul Schulz <pauls@caemrad.com.au> +reports the same for Sun Type 5 Keyboard with PS/2 connector, +NCD model N-123NA. The scancodes are very similar to those given above: +

      # Sun Keys (far left) +

      44 (Help), +42 (Stop), +40 (Again), +3e (Props), +65 (Undo), +70 (Front), +66 (Copy), +67 (Open), +68 (Paste), +69 (Find), +6a (Cut), +

      # Top row +

      64 (ESC), +58 (F1), +59 (F2), +5a (F3), +5b (F4), +5c (F5), +5d (F6), +5e (F7), +5f (F8), +60 (F9), +61 (F10), +62 (F11), +63 (F12), +

      # 1st row +

      29 (~/`), +02 (!/1), +03 (@/2), +04 (#/3), +05 ($/4), +06 (%/5), +07 (^/6), +08 (&/7), +09 (*/8), +0a ((/9), +0b ()/0), +0c (_/-), +0d (+/=), +0e (BS), +

      # 2nd row +

      0f (TAB), +10 (Q), +11 (W), +12 (E), +13 (R), +14 (T), +15 (Y), +16 (U), +17 (I), +18 (O), +19 (P), +1a ({/[), +1b (}/]), +75 (|/\), +

      # 3rd row +

      29 (CAPS), +30 (A), +31 (S), +32 (D), +33 (F), +34 (G), +35 (H), +36 (J), +37 (K), +38 (L), +39 (:/;), +40 ("/'), +28 (Enter), +

      # 4th row +

      2a (Shift), +2c (Z), +2d (X), +2e (C), +2f (V), +30 (B), +31 (N), +32 (M), +33 (</,), +34 (>/.), +35 (?//), +36 (Shift), +

      # Bottom row +

      38 (Ctrl), +71 (Alt), +66 (Meta), +39 (Space), +6c (Meta), +72 (Compose), +3a (Alt), +

      # To the right +

      6e (PrintScreen/SysRq), +76 (ScrollLock), +77 (Pause/Break), +

      76 (Insert), +7f (Home), +6f (PageUp), +

      79 (Del), +7a (End), +7e (PageDown), +

      80 (.), +81 (.), +82 (.), +

      d4 (.), +78 (Up), +41 (.), +

      56 (Left), +55 (Down), +7d (Right), +

      # Keypad +

      6d (Mute), +73 (Brightness/Vol Down), +74 (Brightness/Vol Up), +53 (Setup), +

      01 (NumLock), +45 (/), +46 (*), +54 (-), +

      47 (7/Home), +48 (8/Up), +4d (9/PgUp), +37 (+), +

      4b (4/Left), +4c (5), +4d (6/Right), +

      4f (1/End), +50 (2/Down), +51 (3/PgDn), +4e (Enter), +

      52 (0/Ins), +53 (./Del). +

      +

      6.3 The NCD N-123UX keyboard +

      + +

      Don Christensen reports that his NCD N-123UX keyboard +returns scancode Set 3. +

      +

      6.4 The NCD N-97 keyboard +

      + +

      David Monro reports: I have a PS/2 keyboard, an NCD N-97, +which shipped with some NCD X terminals and also with some Mips +workstations IIRC. This keyboard returns Set 3 keycodes +even when its told to be in Set 2. In particular, the release +codes for F9 and F10 are e0 and e1. +The +keyboard ID is ab 85. +

      +

      +

      6.5 NCD X terminals +

      + +

      NCD keyboards are often used with NCD X terminals. +Here the key combinations to get into the boot monitor. +

      +

      +

      +N-101 LCtrl-LAlt-Setup
      +N-102 or Windows compatible LAlt-CapsLock-Setup
      +VT220-compatible Ctrl-Compose-F3
      +N-108LK Ctrl-LAlt-F3
      +N-97 LAlt-CapsLock-Setup
      +N-97 Kana and Hitachi Kana LAlt-CapsLock-Setup
      +N-107 Sun type 4 compatible Stop A (L1-A)
      +N-123 Sun type 5 compatible Stop-A (L1-A)
      +Nokia 122
      +3270 (122-key Lexmark) LShift LAlt Setup
      + (on the left keypad)
      + +
      +

      +

      +

      +

      +


      +Next +Previous +Contents + + diff --git a/specs/kbd/scancodes-7.html b/specs/kbd/scancodes-7.html new file mode 100644 index 0000000..0191d4a --- /dev/null +++ b/specs/kbd/scancodes-7.html @@ -0,0 +1,164 @@ + + + + + + Keyboard scancodes: Japanese keyboards + + + + + +Next +Previous +Contents +
      +

      7. Japanese keyboards

      + +

      +

      +

      +

      + + +
      + +
      + + +
      +

      +

      7.1 Japanese 86/106 keyboards +

      + +

      (Information from Barry Yip <g609296@cc.win.or.jp>, +Norman Diamond, NIIBE Yutaka and H. Peter Anvin, who +contributed the photographs of his +JP106 keyboard above and of his +Japanese laptop.) +

      Common Japanese keyboards have five additional keys +(106-key, or 86-key for a notebook; these days there may also +be 3 extra Windows keys). These keys have scancodes +70 (hiragana/katakana), +73 (backslash/underscore), +79 (henkan/zenkouho), +7b (muhenkan), +7d (yen/vertical bar). +

      + +Different keycaps: +

      +

      +USB Scancode Japanese US USB Scancode Japanese US
      +5329(hankaku/zenkaku)(` / ~) 471a(@ / `)([ / {)
      +3103 (2 / ") (2 / @) 481b([ / {) (] / })
      +3507 (6 / &) (6 / ^) 5127(; / +) (; / :)
      +3608 (7 / ') (7 / &) 5228(: / *) (' / ")
      +3709 (8 / () (8 / *) 292b(] / }) (backslash / |)
      +380a (9 / )) (9 / () 13573(backslash / _)
      +390b (0 / ~) (0 / )) 1397b(muhenkan)
      +450c (- / =) (- / _)13879(henkan/zenkouho)
      +460d (^ / overbar) (= / +) 13670(hiragana/katakana)
      +1377d (\ / |)
      + +
      +

      ASCII and JIS-Roman differ in two or three points: the code positions +where ASCII has backslash, tilde, broken bar, +JIS-Roman uses yen, overbar and vertical bar, respectively. +

      Some keyboards have the tilde printed on the keycap for the 0 key, some don't. +Similarly, some keyboards have the backslash printed on the keycap for the _ key +and some don't, but in all cases you need Shift to get _. +

      +

      7.2 Description of the all-Japanese keys +

      + +

      Norman Diamond adds to the previous section: +

      To the left of the spacebar, +(Shift-JIS) –³•ÏŠ· +(muhenkan) means no conversion +from kana to kanji. To the right of the spacebar, +•ÏŠ· +(henkan) means conversion from kana to kanji. In Microsoft systems +it converts the most recently input sequence of kana to the system's +first guess at a string of kanji/kana/etc. with the correct pronunciation +and a guess at the meaning. Repeated keypresses change it to other +possible guesses which are either less common or less recently used, +depending on the situation. The shifted version of this key is +‘OŒò•â +(zenkouho) which means "previous candidate" -- "zen" means "previous", +while "kouho" means "candidate" (explanation courtesy of NIIBE Yutaka) +-- it rotates back to earlier guesses for kanji conversion. +The alt version of this key is +‘SŒò•â +also pronounced (zenkouho), which means "all candidates" -- here, +"zen" means "all" -- it displays a menu of all known guesses. +I never use the latter two functions of the key, because after +pushing the henkan key about three times and not getting the desired guess, +it displays a menu of all known guesses anyway. +

      Next on the right, +‚Ђ炪‚È +(hiragana) means that +phonetic input uses one conventional Japanese phonetic alphabet, +which of course can be converted to kanji by pressing the henkan key later. +The shifted version is +ƒJƒ^ƒJƒi +(katakana) which means the other Japanese phonetic alphabet, +and the alt version is +ƒ[ƒ}Žš +(ro-maji) which means the Roman alphabet. +

      Near the upper left, +”¼/‘S +(han/zen) means switch between hankaku +(half-size, the same size as an ASCII character) and zenkaku +(full-size, since the amount of space occupied by a kanji +is approximately a square, twice as fat as an ASCII character). +It only affects katakana and a few other characters +(for example there's a full-width copy of each ASCII character +in addition to the single-byte half-width encodings). +The alt version of this is +Š¿Žš +(kanji) which +actually causes typed Roman phonetic keys to be displayed as Japanese +phonetic kana (either hiragana or katakana depending on one of the other +keys described above) and doesn't cause conversion to kanji. +

      +

      7.3 A Japanese keyboard that imitates a US one +

      + +

      John Bradford reports that he has a Japanese keyboard +(an IBM 5576 KEYBOARD-2, part number 94X1110) that by default +simulates US key layout. Thus, pressing the @ key yields scancodes +2a 03 (fake shift followed by digit 2), +pressing Shift - yields scancodes b6 0d +(fake shift down, =) with release 8d 36, etc. +

      Thus, the (translated Set 2) scancodes can be read off the +table with differences between the +Japanese and the US layout. +

      In this state the non-ASCII keys (Yen and overline) yield an error +(ff). The Japanese keys hankaku, kanji/katakana, muhenkan, +zenkoho/henkan, hiragana, zenmen ki, yield the codes expected from +keys in that position on a US keyboard: 29 (`/~), +38 (LAlt), 39 (space), 39 (space), +39 (space), e0 38 (RAlt), respectively. +

      Switching the keyboard to Set 3 enables the Japanese keys. +In untranslated Set 3 these give codes: hankaku 0e, +Yen 13, overline (shift ^), kanji/katakana 19, +muhenkan 85, zenkoho/henkan 86, +hiragana 87, zenmen ki 39. +(Also: backslash/underscore 5c, bracketright/braceright 53.) +

      This is the only keyboard I know that gives more information in Set 3 +than in Set 2. It reports +keyboard ID +ab 90. +

      +

      + + +
      +

      +


      +Next +Previous +Contents + + diff --git a/specs/kbd/scancodes-8.html b/specs/kbd/scancodes-8.html new file mode 100644 index 0000000..5a5bbc9 --- /dev/null +++ b/specs/kbd/scancodes-8.html @@ -0,0 +1,75 @@ + + + + + Keyboard scancodes: Korean keyboards + + + + + +Next +Previous +Contents +
      +

      8. Korean keyboards

      + +

      The Korean keyboard has two keys, the Korean/Chinese +and the Korean/English toggles, that generate scancodes +f1 and f2 (respectively) when pressed, +and nothing when released. They do not repeat. +The keycaps are "hancha" and "han/yong" (written in Hangul). +Hancha (hanja) means Chinese character, and Han/Yong is short for +Hangul/Yongcha (Korean/English). +They are located left and right of the space bar. +

      +

      +

      8.1 An A4tech keyboard +

      + +

      Dave Willis reports on his A4tech keyboard: +

      Apart from the Korean Hancha and Han/Yong keys, there are on the top row: +

      e0 5f (Moon), +e0 6c (Mail), +e0 6b (Computer), +e0 21 (Calculator), +e0 6d (Notes), +e0 10 (Previous), +e0 19 (Next), +e0 2e (Minus), +e0 20 (Mute), +e0 30 (Plus), +e0 22 (Play/Pause), +e0 24 (Stop), +e0 65 (Magnifier), +e0 32 (Home), +e0 66 (Folder), +e0 67 (recycle-style arrows), +e0 68 (x). +

      Below mute: +e0 62 (Office). +

      On the right hand side: +e0 6a (arrow up left), +e0 69 (arrow down right), +e0 0b (wheel up), +e0 2c (wheel down), +e0 64 (wheel in). +

      Wheel up and wheel down have no release code, only the plus and minus keys +will repeat themselves when held down. +

      +

      8.2 The DEC LK201-K +

      + +

      +

      + + +
      +

      +

      +


      +Next +Previous +Contents + + diff --git a/specs/kbd/scancodes-9.html b/specs/kbd/scancodes-9.html new file mode 100644 index 0000000..44451c6 --- /dev/null +++ b/specs/kbd/scancodes-9.html @@ -0,0 +1,403 @@ + + + + + Keyboard scancodes: Keyboard-internal scancodes + + + + + +Next +Previous +Contents +
      +

      9. Keyboard-internal scancodes

      + +

      +

      9.1 Three scancode sets +

      + +

      The usual PC keyboards are capable of producing three sets of scancodes. +Writing 0xf0 followed by 1, 2 or 3 to port 0x60 will put the keyboard +in scancode mode 1, 2 or 3. Writing 0xf0 followed by 0 queries the mode, +resulting in a scancode byte 43, 41 or 3f +from the keyboard. +

      Set 1 contains the values that the XT keyboard (with only one set +of scancodes) produced, with extensions for new keys. Someone +decided that another numbering was more logical and invented +scancode Set 2. However, it was realized that new scancodes +would break old programs, so the keyboard output was fed to a +8042 microprocessor on the motherboard that could translate Set 2 +back into Set 1. Indeed a smart construction. This is the default today. +Finally there is the PS/2 version, Set 3, more regular, but used by +almost nobody. +

      (I wrote this long ago. Nowadays Linux 2.5 may try to use Set 3. +Also certain HP machines, like the PS/2 version of the HP9000 +workstation, have used Set 3.) +

      Sets 2 and 3 are designed to be translated by the 8042. +Set 1 should not be translated. +

      Not all keyboards support all scancode sets. For example, my MyCom +laptop only supports scancode Set 2, and its keyboard does not react +at all when in mode 1 or 3. +

      +

      9.2 Make and Break codes +

      + +

      The key press / key release is coded as follows: +

      For Set 1, if the make code of a key is c, the break code +will be c+0x80. If the make code is e0 c, +the break code will be e0 c+0x80. +The Pause key has make code e1 1d 45 +e1 9d c5 and does not generate a break code. +

      For Set 2, if the make code of a key is c, the break code +will be f0 c. If the make code is e0 c, +the break code will be e0 f0 c. +The Pause key has the 8-byte make code e1 14 77 +e1 f0 14 f0 77. +

      For Set 3, by default most keys do not generate a break code - only CapsLock, +LShift, RShift, LCtrl and LAlt do. However, by default all non-traditional +keys do generate a break code - thus, LWin, RWin, Menu do, and for example +on the Microsoft Internet keyboard, so do Back, Forward, Stop, +Mail, Search, Favorites, Web/Home, MyComputer, Calculator, Sleep. +On my BTC keyboard, also the Macro key does. +

      In Scancode Mode 3 it is possible to enable or disable key repeat +and the production of break codes either on a key-by-key basis +or for all keys at once. +And just like for Set 2, key release is indicated by a f0 prefix +in those cases where it is indicated. +There is nothing special with the Pause key in scancode mode 3. +

      +

      9.3 Translation +

      + +

      The 8042 microprocessor translates the incoming byte stream produced +by the keyboard, and turns an f0 prefix into an OR with +80 for the next byte. + +(Some implementations do this for the next byte that does not have +this bit set already. A consequence is that in Set 3 the keys with Set-3 +value 0x80 or more are broken in a peculiar way: hitting such a key and +then some other key turns the make code for this last key into a break code. +For example the Sleep key on a Microsoft Internet keyboard generates +54 / d4 for press/release. But pressing and +releasing first Menu and then Sleep produces +8d 8d d4 d4 as translation of +8d f0 8d 54 f0 54. +Other implementations are OK.) +

      + +Unless told not to translate, the keyboard controller translates +keyboard scancodes into the scancodes it returns to the CPU +using the following table (in hex): +

      +

      +

      + 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
      +
      +00 ff 43 41 3f 3d 3b 3c 58 64 44 42 40 3e 0f 29 59
      +10 65 38 2a 70 1d 10 02 5a 66 71 2c 1f 1e 11 03 5b
      +20 67 2e 2d 20 12 05 04 5c 68 39 2f 21 14 13 06 5d
      +30 69 31 30 23 22 15 07 5e 6a 72 32 24 16 08 09 5f
      +40 6b 33 25 17 18 0b 0a 60 6c 34 35 26 27 19 0c 61
      +50 6d 73 28 74 1a 0d 62 6e 3a 36 1c 1b 75 2b 63 76
      +60 55 56 77 78 79 7a 0e 7b 7c 4f 7d 4b 47 7e 7f 6f
      +70 52 53 50 4c 4d 48 01 45 57 4e 51 4a 37 49 46 54
      +80 80? 81 82 41 54 85 86 87 88 89 8a 8b 8c 8d 8e 8f
      +90 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f
      +a0 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af
      +b0 b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf
      +c0 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf
      +d0 d0 d1 d2 d3 d4 d5? d6 d7 d8 d9? da? db dc dd de df
      +e0 e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef?
      +f0 - f1? f2? f3? f4? f5? f6? f7? f8? f9? fa? fb? fc? fd? fe? ff
      + +
      +

      A reference for the first half of this table is the book by Gary J Konzak +PC 8042 Controller, ISBN 0-929392-21-3. +(Report by vojtech@suse.cz.) +

      A way to check this table is: (i) put the keyboard in untranslated modes +1, 2, 3 and look at the +resulting values, +and (ii) put the keyboard in translated scancode modes 1, 2, 3. Now compare +the values. The entries with question marks were not checked in this way. +

      Note that the range 01-7f of this table is 1-1. +In the second half of the table, translated and untranslated values +are equal in all known cases, with the two exceptions 83 and 84. +

      One asks the controller to transmit untranslated scancodes by writing +a keyboard controller command with bit 5 set and bit 6 cleared. +E.g., use the command byte 45 to get translated codes, +and 24 to get untranslated codes that do not cause interrupts. +

      +

      Effects of translation

      + +

      +

      Origin of strange scan code set values

      + +

      The keyboard command f0 with argument 1, 2 or 3 +sets the current scancode set, and this same command +with argument 0 asks for the current scancode set. +The reply is 43, 41 or 3f +for sets 1, 2, 3. Why? Because in reality the reply is 1, 2 or 3, +and that is what one sees when translation is off. But translation +turns these into 43, 41, 3f. +

      +

      Keyboard IDs

      + +

      Keyboards do report an ID as a reply to the command + +f2. +(An XT keyboard does not reply, an AT keyboard only replies with an ACK.) +An MF2 AT keyboard reports ID ab 83. +Translation turns this into ab 41. +

      Many short keyboards, like IBM ThinkPads, and Spacesaver keyboards, +send ab 84 untranslated, +which becomes ab 54 translated. +(The netbsd source has a misunderstanding here, and seems to associate +the 54 and 84 to the ThinkPad model - cf. the defines +KEYB_R_MF2ID2TP75X, KEYB_R_MF2ID2TP76X.) +

      Several 122-key keyboards are reported to send ab 86. +Here translated and untranslated values coincide. +(Reports mention "122-Key Enhanced Keyboard", "standard 122-key keyboard", +"122 Key Mainframe Interactive (MFI) Keyboard".) +

      David Monro reports ab 85 for a +NCD N-97 keyboard. +Tim Clarke reports ab 85 for the +"122-Key Host Connect(ed) Keyboard". +

      He also reports +Also, when playing with my KVM problems Belkin gave me a +105-key Windows keyboard which Id.s itself as 18ABh. +

      Linux 2.5.25 kernel source has 0xaca1 for a +"NCD Sun layout keyboard". It also mentions 0xab02 and 0xab7f, +but these arise as (mistaken) back translations from +ab 41 and ab 54. +

      Ralph Brown's Interrupt list mentions "old Japanese 'G', 'P', 'A' keyboards", +with keyboard IDs ab 90, ab 91, +ab 92. Here translated and untranslated versions +coincide. ID ab 90 was also mentioned +above. +

      +

      +

      9.4 Correspondence +

      + +

      For the traditional keys the correspondence is fairly clear: +above we saw the +translation table, +and Set 1 equals translated Set 2, and Set 3 equals Set 2 in most cases +where Set 2 has a single (non-escaped) scancode, +and in any case the correspondence is constant (and given +below). +

      On the other hand, modern keyboards have all kinds of multimedia +and other additional keys, and what happens for them is completely +random, and varies from keyboard to keyboard. +

      Let us look at an example. +

      The +Microsoft Internet keyboard +has keys Search, Favorites, Stop, Forward, Back, My Computer, +Mail, Web / Home, Calculator with translated Set 3 scancodes +65, 66, 68, 69, 6a, +6b, 6c, 97, 99, respectively, +and translated Set 2 scancodes e0 xx, with +xx = 65, 66, 68, 69, +6a, 6b, 6c, 32, 21. +

      On the other hand, the +IBM Rapid Access II keyboard +has keys CD stop, CD play, Volume D, Volume U, CD back, CD fwd +with translated Set 3 scancodes +69, 6a, 6b, 6c, 6d, 44, +and translated Set 2 scancodes e0 xx, with +xx = 20, 22, 21, 23, +24, 12. +

      Thus, different keyboards have different mappings between Set 2 +and Set 3 codes. +

      +

      9.5 Use +

      + +

      Can these other scancode sets be used? Probably not. +

      () Translated scancode Set 1 has weird codes that nobody wants to use. +

      (i) My MyCom laptop does not support scancode sets 1 and 3 at all. +

      (ii) Some laptops have special key combinations that bring one +into a setup or configuration utility. It is impossible to do +anything useful, or to get out of it again, when the scancode mode +is not translated Set 2. +

      (iii) Many keyboards have bugs in scancode sets 1 and/or 3 but +are fine in scancode Set 2. +Vojtech Pavlik reports that his BTC keyboard has the same codes +for the '1' and '2' keys in Set3, both having the code for '1'). +On my BTC keyboard the key up value for Esc and 1 are both ff +in scancode Set 1. My Safeway keyboard has untranslated Set 1 equal +to translated Set 2, except for the multimedia keys, where +untranslated Set 1 equals untranslated Set 2. +

      (iv) A big advantage of Set 3 is that each key generates a unique code +so that one does not need to parse sequences. However, the BTC keyboard +mentioned +above generates e0 6f +for its Macro key also in scancode mode 3. The Safeway keyboard mentioned +above does not generate any codes +for its multimedia keys in scancode mode 3. +

      (v) Some keyboard controllers cannot handle Set 3 values that are +larger than 0x7f, and give +peculiar results +for e.g. the Windows keys in translated scancode mode 3. +The result is that the following key is "eaten": the key down action +turns into a key up. +

      (vi) The USB legacy support only supports translated Set 2. +

      (vii) The +Microsoft Keyboard Scan Code Specification writes: +In the very early days of Windows NT, an attempt was made +to use the much more orthogonal Scan Code Set 3, but due to bugs +in the implementation of this Scan Code Set on numerous OEM +keyboards, the idea was abandoned. +And also: Scan Code Set 3 is not used or required for operation +of Microsoft operating systems. +

      (viii) Others also tried Set 3. The PS/2 version of the HP9000 +workstation uses it. This is fine with HP's keyboards but causes +some problems with foreign keyboards. +

      (ix) It is said that Hal Snyder of Mark Williams, Co remarked: +"We find that about 10% of cheap no-name keyboards do not work +in scan code set 3". +

      (x) These days Linux probes the keyboard, and may try to enable Set 3. +This is good for learning a lot about strange keyboards. +It is bad for having a stable system that just works. +

      +

      9.6 A table +

      + +

      (USB codes in decimal, scancodes in hex.) +

      +

      +

      +# USB Set 1 X(Set 1) Set 2 X(Set 2) Set 3 X(Set 3) keycap
      +1 53 29 39 0e 29 0e 29 ` ~
      +2 30 02 41 16 02 16 02 1 !
      +3 31 03 3f 1e 03 1e 03 2 @
      +4 32 04 3d 26 04 26 04 3 #
      +5 33 05 3b 25 05 25 05 4 $
      +6 34 06 3c 2e 06 2e 06 5 % E
      +7 35 07 58 36 07 36 07 6 ^
      +8 36 08 64 3d 08 3d 08 7 &
      +9 37 09 44 3e 09 3e 09 8 *
      +10 38 0a 42 46 0a 46 0a 9 (
      +11 39 0b 40 45 0b 45 0b 0 )
      +12 45 0c 3e 4e 0c 4e 0c - _
      +13 46 0d 0f 55 0d 55 0d = +
      +15 42 0e 29 66 0e 66 0e Backspace
      +16 43 0f 59 0d 0f 0d 0f Tab
      +17 20 10 65 15 10 15 10 Q
      +18 26 11 38 1d 11 1d 11 W
      +19 8 12 2a 24 12 24 12 E
      +20 21 13 70 2d 13 2d 13 R
      +21 23 14 1d 2c 14 2c 14 T
      +22 28 15 10 35 15 35 15 Y
      +23 24 16 02 3c 16 3c 16 U
      +24 12 17 5a 43 17 43 17 I
      +25 18 18 66 44 18 44 18 O
      +26 19 19 71 4d 19 4d 19 P
      +27 47 1a 2c 54 1a 54 1a [ {
      +28 48 1b 1f 5b 1b 5b 1b ] }
      +29 49 2b 21 5d 2b 5c 75 \ |
      +30 57 3a 32 58 3a 14 1d CapsLock
      +31 4 1e 03 1c 1e 1c 1e A
      +32 22 1f 5b 1b 1f 1b 1f S
      +33 7 20 67 23 20 23 20 D
      +34 9 21 2e 2b 21 2b 21 F
      +35 10 22 2d 34 22 34 22 G
      +36 11 23 20 33 23 33 23 H
      +37 13 24 12 3b 24 3b 24 J
      +38 14 25 05 42 25 42 25 K
      +39 15 26 04 4b 26 4b 26 L
      +40 51 27 5c 4c 27 4c 27 ; :
      +41 52 28 68 52 28 52 28 ' "
      +42 50 00 ff 00 ff 00 ff non-US-1
      +43 40 1c 1e 5a 1c 5a 1c Enter
      +44 225 2a 2f 12 2a 12 2a LShift
      +46 29 2c 14 1a 2c 1a 2c Z
      +47 27 2d 13 22 2d 22 2d X
      +48 6 2e 06 21 2e 21 2e C
      +49 25 2f 5d 2a 2f 2a 2f V
      +50 5 30 69 32 30 32 30 B
      +51 17 31 31 31 31 31 31 N
      +52 16 32 30 3a 32 3a 32 M
      +53 54 33 23 41 33 41 33 , <
      +54 55 34 22 49 34 49 34 . >
      +55 56 35 15 4a 35 4a 35 / ?
      +57 229 36 07 59 36 59 36 RShift
      +58 224 1d 11 14 1d 11 38 LCtrl
      +60 226 38 6a 11 38 19 71 LAlt
      +61 44 39 72 29 39 29 39 space
      +62 230 e0-38 e0-6a e0-11 e0-38 39 72 RAlt
      +64 228 e0-1d e0-11 e0-14 e0-1d 58 3a RCtrl
      +75 73 e0-52 e0-28 e0-70 e0-52 67 7b Insert
      +76 76 e0-53 e0-74 e0-71 e0-53 64 79 Delete
      +80 74 e0-47 e0-60 e0-6c e0-47 6e 7f Home
      +81 77 e0-4f e0-61 e0-69 e0-4f 65 7a End
      +85 75 e0-49 e0-34 e0-7d e0-49 6f 6f PgUp
      +86 78 e0-51 e0-73 e0-7a e0-51 6d 7e PgDn
      +79 80 e0-4b e0-26 e0-6b e0-4b 61 56 Left
      +83 82 e0-48 e0-6c e0-75 e0-48 63 78 Up
      +84 81 e0-50 e0-6d e0-72 e0-50 60 55 Down
      +89 79 e0-4d e0-19 e0-74 e0-4d 6a 7d Right
      +90 83 45 0b 77 45 76 01 NumLock
      +91 95 47 60 6c 47 6c 47 KP-7 / Home
      +92 92 4b 26 6b 4b 6b 4b KP-4 / Left
      +93 89 4f 61 69 4f 69 4f KP-1 / End
      +95 84 e0-35 e0-15 e0-4a e0-35 77 45 KP-/
      +96 96 48 6c 75 48 75 48 KP-8 / Up
      +97 93 4c 27 73 4c 73 4c KP-5
      +98 90 50 6d 72 50 72 50 KP-2 / Down
      +99 98 52 28 70 52 70 52 KP-0 / Ins
      +100 85 37 5e 7c 37 7e 46 KP-*
      +101 97 49 34 7d 49 7d 49 KP-9 / PgUp
      +102 94 4d 19 74 4d 74 4d KP-6 / Right
      +103 91 51 73 7a 51 7a 51 KP-3 / PgDn
      +104 99 53 74 71 53 71 53 KP-. / Del
      +105 86 4a 35 7b 4a 84 54 KP--
      +106 87 4e 0c 79 4e 7c 37 KP-+
      +108 88 e0-1c e0-1e e0-5a e0-1c 79 4e KP-Enter
      +110 41 01 43 76 01 08 64 Esc
      +112 58 3b 24 05 3b 07 58 F1
      +113 59 3c 16 06 3c 0f 59 F2
      +114 60 3d 08 04 3d 17 5a F3
      +115 61 3e 09 0c 3e 1f 5b F4
      +116 62 3f 5f 03 3f 27 5c F5
      +117 63 40 6b 0b 40 2f 5d F6
      +118 64 41 33 83 41 37 5e F7
      +119 65 42 25 0a 42 3f 5f F8
      +120 66 43 17 01 43 47 60 F9
      +121 67 44 18 09 44 4f 61 F10
      +122 68 57 6e 78 57 56 62 F11
      +123 69 58 3a 07 58 5e 63 F12
      +124 70 e0-37 e0-5e e0-7c e0-37 57 6e PrtScr
      +0 154 54 1a 84 54 57 6e Alt+SysRq
      +125 71 46 0a 7e 46 5f 76 ScrollLock
      +126 72 e1-1d-45 e1-11-0b e1-14-77 e1-1d-45 62 77 Pause
      +0 0 e0-46 e0-0a e0-7e e0-46 62 77 Ctrl+Break
      +0 227 e0-5b e0-1b e0-1f e0-5b 8b 8b LWin (USB: LGUI)
      +0 231 e0-5c e0-75 e0-27 e0-5c 8c 8c RWin (USB: RGUI)
      +0 0 e0-5d e0-2b e0-2f e0-5d 8d 8d Menu
      +0 0 e0-5f e0-76 e0-3f e0-5f 7f 54 Sleep
      +0 0 e0-5e e0-63 e0-37 e0-5e 00 ff Power
      +0 0 e0-63 e0-78 e0-5e e0-63 00 ff Wake
      + +
      +

      +

      +

      9.7 Vendor extensions +

      + +

      + +Logitech uses an e2 prefix for the codes sent by a +pointing device integrated on the keyboard. +

      +

      +

      +

      +


      +Next +Previous +Contents + + diff --git a/specs/kbd/scancodes.html b/specs/kbd/scancodes.html new file mode 100644 index 0000000..f25761f --- /dev/null +++ b/specs/kbd/scancodes.html @@ -0,0 +1,175 @@ + + + + + Keyboard scancodes + + + + + +Next +Previous +Contents +
      +

      Keyboard scancodes

      + +

      Andries Brouwer, aeb@cwi.nl

      v1.2e, 2004-05-20 +


      +This note contains some information about PC keyboard scancodes. +
      +

      +

      1. Keyboard scancodes

      + + +

      +

      2. Special keyboards - XT keyboards

      + + +

      +

      3. Special keyboards - Amstrad/Schneider keyboards

      + + +

      +

      4. Special keyboards - AT keyboards

      + +

      +

      5. Special keyboards - MF II keyboards

      + + +

      +

      6. NCD keyboards

      + + +

      +

      7. Japanese keyboards

      + + +

      +

      8. Korean keyboards

      + + +

      +

      9. Keyboard-internal scancodes

      + + +

      +

      10. The AT keyboard controller

      + + +

      +

      11. Keyboard commands

      + + +

      +

      12. The PS/2 Mouse

      + + +

      +

      13. USB

      + +

      +

      14. Reporting

      + +
      +Next +Previous +Contents + + diff --git a/specs/kbd/sk2500.jpg b/specs/kbd/sk2500.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b74122ae29da3a815b9635b30749c9dd1cd29385 GIT binary patch literal 10202 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 literal 0 HcmV?d00001 diff --git a/specs/kbd/table.h b/specs/kbd/table.h new file mode 100644 index 0000000..5f7c56f --- /dev/null +++ b/specs/kbd/table.h @@ -0,0 +1,170 @@ +/* Scancode stuff - aeb, 991216 */ + +/* translation from keyboard to scancode - the 8042 table */ + +unsigned char ttable[256] = { +0xff,0x43,0x41,0x3f,0x3d,0x3b,0x3c,0x58,0x64,0x44,0x42,0x40,0x3e,0x0f,0x29,0x59, +0x65,0x38,0x2a,0x70,0x1d,0x10,0x02,0x5a,0x66,0x71,0x2c,0x1f,0x1e,0x11,0x03,0x5b, +0x67,0x2e,0x2d,0x20,0x12,0x05,0x04,0x5c,0x68,0x39,0x2f,0x21,0x14,0x13,0x06,0x5d, +0x69,0x31,0x30,0x23,0x22,0x15,0x07,0x5e,0x6a,0x72,0x32,0x24,0x16,0x08,0x09,0x5f, +0x6b,0x33,0x25,0x17,0x18,0x0b,0x0a,0x60,0x6c,0x34,0x35,0x26,0x27,0x19,0x0c,0x61, +0x6d,0x73,0x28,0x74,0x1a,0x0d,0x62,0x6e,0x3a,0x36,0x1c,0x1b,0x75,0x2b,0x63,0x76, +0x55,0x56,0x77,0x78,0x79,0x7a,0x0e,0x7b,0x7c,0x4f,0x7d,0x4b,0x47,0x7e,0x7f,0x6f, +0x52,0x53,0x50,0x4c,0x4d,0x48,0x01,0x45,0x57,0x4e,0x51,0x4a,0x37,0x49,0x46,0x54, +0x80,0x81,0x82,0x41,0x54,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, +0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f, +0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf, +0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf, +0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf, +0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf, +0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef, +0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff +}; + +/* some entries guessed - see scancodes.sgml */ + + +/* Untranslated scancodes, and USB key values. + For translated values, feed through ttable[]. + + I also included Vojtech Pavlik's scancodes.h in this directory. + It mostly agrees with this table, but lacks + Microsoft Internet keys, and misses some set1 values. */ + +struct keycode { + unsigned int position, usb, set1, set2, set3; + char *name; /* keycap on a standard US keyboard */ +} keycodes[] = { + 1, 53, 0x29, 0x0e, 0x0e, "`~", + 2, 30, 0x02, 0x16, 0x16, "1!", + 3, 31, 0x03, 0x1e, 0x1e, "2@", + 4, 32, 0x04, 0x26, 0x26, "3#", + 5, 33, 0x05, 0x25, 0x25, "4$", + 6, 34, 0x06, 0x2e, 0x2e, "5%E", + 7, 35, 0x07, 0x36, 0x36, "6^", + 8, 36, 0x08, 0x3d, 0x3d, "7&", + 9, 37, 0x09, 0x3e, 0x3e, "8*", + 10, 38, 0x0a, 0x46, 0x46, "9(", + 11, 39, 0x0b, 0x45, 0x45, "0)", + 12, 45, 0x0c, 0x4e, 0x4e, "-_", + 13, 46, 0x0d, 0x55, 0x55, "=+", + 15, 42, 0x0e, 0x66, 0x66, "Backspace", + + 16, 43, 0x0f, 0x0d, 0x0d, "Tab", + 17, 20, 0x10, 0x15, 0x15, "Q", + 18, 26, 0x11, 0x1d, 0x1d, "W", + 19, 8, 0x12, 0x24, 0x24, "E", + 20, 21, 0x13, 0x2d, 0x2d, "R", + 21, 23, 0x14, 0x2c, 0x2c, "T", + 22, 28, 0x15, 0x35, 0x35, "Y", + 23, 24, 0x16, 0x3c, 0x3c, "U", + 24, 12, 0x17, 0x43, 0x43, "I", + 25, 18, 0x18, 0x44, 0x44, "O", + 26, 19, 0x19, 0x4d, 0x4d, "P", + 27, 47, 0x1a, 0x54, 0x54, "[{", + 28, 48, 0x1b, 0x5b, 0x5b, "]}", + 29, 49, 0x2b, 0x5d, 0x5c, "\\|", + + 30, 57, 0x3a, 0x58, 0x14, "CapsLock", + 31, 04, 0x1e, 0x1c, 0x1c, "A", + 32, 22, 0x1f, 0x1b, 0x1b, "S", + 33, 7, 0x20, 0x23, 0x23, "D", + 34, 9, 0x21, 0x2b, 0x2b, "F", + 35, 10, 0x22, 0x34, 0x34, "G", + 36, 11, 0x23, 0x33, 0x33, "H", + 37, 13, 0x24, 0x3b, 0x3b, "J", + 38, 14, 0x25, 0x42, 0x42, "K", + 39, 15, 0x26, 0x4b, 0x4b, "L", + 40, 51, 0x27, 0x4c, 0x4c, ";:", + 41, 52, 0x28, 0x52, 0x52, "'\"", + 42, 50, 0, 0, 0, "non-US-1", + 43, 40, 0x1c, 0x5a, 0x5a, "Enter", + + 44, 225, 0x2a, 0x12, 0x12, "LShift", + 46, 29, 0x2c, 0x1a, 0x1a, "Z", + 47, 27, 0x2d, 0x22, 0x22, "X", + 48, 6, 0x2e, 0x21, 0x21, "C", + 49, 25, 0x2f, 0x2a, 0x2a, "V", + 50, 5, 0x30, 0x32, 0x32, "B", + 51, 17, 0x31, 0x31, 0x31, "N", + 52, 16, 0x32, 0x3a, 0x3a, "M", + 53, 54, 0x33, 0x41, 0x41, ",<", + 54, 55, 0x34, 0x49, 0x49, ".>", + 55, 56, 0x35, 0x4a, 0x4a, "/?", + 57, 229, 0x36, 0x59, 0x59, "RShift", + + 58, 224, 0x1d, 0x14, 0x11, "LCtrl", + 60, 226, 0x38, 0x11, 0x19, "LAlt", + 61, 44, 0x39, 0x29, 0x29, "space", + 62, 230, 0xe038, 0xe011, 0x39, "RAlt", + 64, 228, 0xe01d, 0xe014, 0x58, "RCtrl", + + 75, 73, 0xe052, 0xe070, 0x67, "Insert", + 76, 76, 0xe053, 0xe071, 0x64, "Delete", + 80, 74, 0xe047, 0xe06c, 0x6e, "Home", + 81, 77, 0xe04f, 0xe069, 0x65, "End", + 85, 75, 0xe049, 0xe07d, 0x6f, "PgUp", + 86, 78, 0xe051, 0xe07a, 0x6d, "PgDn", + + 79, 80, 0xe04b, 0xe06b, 0x61, "Left", + 83, 82, 0xe048, 0xe075, 0x63, "Up", + 84, 81, 0xe050, 0xe072, 0x60, "Down", + 89, 79, 0xe04d, 0xe074, 0x6a, "Right", + + 90, 83, 0x45, 0x77, 0x76, "NumLock", + 91, 95, 0x47, 0x6c, 0x6c, "KP-7 / Home", + 92, 92, 0x4b, 0x6b, 0x6b, "KP-4 / Left", + 93, 89, 0x4f, 0x69, 0x69, "KP-1 / End", + 95, 84, 0xe035, 0xe04a, 0x77, "KP-/", + 96, 96, 0x48, 0x75, 0x75, "KP-8 / Up", + 97, 93, 0x4c, 0x73, 0x73, "KP-5", + 98, 90, 0x50, 0x72, 0x72, "KP-2", + 99, 98, 0x52, 0x70, 0x70, "KP-0 / Ins", + 100, 85, 0x37, 0x7c, 0x7e, "KP-*", + 101, 97, 0x49, 0x7d, 0x7d, "KP-9", + 102, 94, 0x4d, 0x74, 0x74, "KP-6 / Right", + 103, 91, 0x51, 0x7a, 0x7a, "KP-3 / PgDn", + 104, 99, 0x53, 0x71, 0x71, "KP-. / Del", + 105, 86, 0x4a, 0x7b, 0x84, "KP--", + 106, 87, 0x4e, 0x79, 0x7c, "KP-+", + 108, 88, 0xe01c, 0xe05a, 0x79, "KP-Enter", + + 110, 41, 0x01, 0x76, 0x08, "Esc", + 112, 58, 0x3b, 0x05, 0x07, "F1", + 113, 59, 0x3c, 0x06, 0x0f, "F2", + 114, 60, 0x3d, 0x04, 0x17, "F3", + 115, 61, 0x3e, 0x0c, 0x1f, "F4", + 116, 62, 0x3f, 0x03, 0x27, "F5", + 117, 63, 0x40, 0x0b, 0x2f, "F6", + 118, 64, 0x41, 0x83, 0x37, "F7", /* Vojtech has 0x02 in set2 */ + 119, 65, 0x42, 0x0a, 0x3f, "F8", + 120, 66, 0x43, 0x01, 0x47, "F9", + 121, 67, 0x44, 0x09, 0x4f, "F10", + 122, 68, 0x57, 0x78, 0x56, "F11", + 123, 69, 0x58, 0x07, 0x5e, "F12", + + 124, 70, 0xe037, 0xe07c, 0x57, "PrtScr", + 0, 154, 0x54, 0x84, 0x57, "Alt+SysRq", + 125, 71, 0x46, 0x7e, 0x5f, "ScrollLock", + 126, 72, 0xe11d45, 0xe11477, 0x62, "Pause", + 0, 0, 0xe046, 0xe07e, 0x62, "Ctrl+Break", + + /* Microsoft Windows and Internet keys and Power keys */ + 0, 227, 0xe05b, 0xe01f, 0x8b, "LWin (USB: LGUI)", + 0, 231, 0xe05c, 0xe027, 0x8c, "RWin (USB: RGUI)", + 0, 0, 0xe05d, 0xe02f, 0x8d, "Menu", + + 0, 0, 0xe06a, 0xe038, 0x38, "Back", + 0, 0, 0xe069, 0xe030, 0x30, "Forward", + 0, 0, 0xe068, 0xe028, 0x28, "Stop", + 0, 0, 0xe06c, 0xe048, 0x48, "Mail", + 0, 0, 0xe065, 0xe010, 0x10, "Search", + 0, 0, 0xe066, 0xe018, 0x18, "Favorites", + 0, 0, 0xe032, 0xe03a, 0x97, "Web / Home", + + 0, 0, 0xe06b, 0xe040, 0x40, "My Computer", + 0, 0, 0xe021, 0xe02b, 0x99, "Calculator", + 0, 0, 0xe05f, 0xe03f, 0x7f, "Sleep", + 0, 0, 0xe05e, 0xe037, 0, "Power", + 0, 0, 0xe063, 0xe05e, 0, "Wake", +}; diff --git a/specs/kbd/telerate-s.jpg b/specs/kbd/telerate-s.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5082aa33abc5f2f9d0dbcb290bc341669a91adaf GIT binary patch literal 24658 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 De^4i4 literal 0 HcmV?d00001 diff --git a/specs/kbd/telerate.jpg b/specs/kbd/telerate.jpg new file mode 100644 index 0000000000000000000000000000000000000000..02b5564eb9aa241c26d8fdf9a9bc9ee08b776a1d GIT binary patch literal 71406 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⁡a%-Wh!+;?hli8=p4bTXlJ* zR@uA|%mM0o9epe3i+_hd5G|51HoK@vux(=cJUMT2LQ-CMGsV$aUR(`%qc9^n$8lvE z6M>MwbRNFGwH%FX%jWVu`pxt`Bg9wwvTHF&Zj}*Y^8+k+R8x;^AUO9uYCT_8wAOA6 zmh!B~krg;S4s%~L_!jTQJ}uK_xc=B%d6wc!b8gm3Uve>4J!dn*B-lsN?benZ83ZTE`2Bde|No2vPL zYk^^KV_|@$h$H3e^BVc4frD|vI_8@ZZ!^|YGc-Yw^wgP)g#PMiQRIP1yo zYcIn(pN6~>qRC-tt51A|i>YN}kCjvbk;e!-_0Qq*_lR^K73dx$(X^R7XK=FWLCQ)k zt%zNUS+YE@OnxT1TTh4HF2BP?;;l|_M_6oPAp7J;OO>U$N?nn?`$B2b-TW!NmIV@v zcYJmIgc@g7aq>KPZYVy0Ugx)OGbX)BwQMuJ` zblb(*EK}JP`FCyr6${(~4_*alMeviwwl=E|{3JT!YybwD&^zD`gtDCdO*>vHB2Lcd z(wDv{@O|luS#_gsu!ihZ0^5N(E1rx;Ty*0g8mF!5z7N)I=0T{Y$zp;a5F6uwjYHwji6p&eH+QzskfX`-Zd7}mv!80^Z@f9H z>3%WObSsT&^hFxZNNGYR z1%YFn@sdk7C)jiXyl>+T>Pe;P&m4=1HA{EkgODW+kH{a&uq?h6c#7?1TWxPvxD3N- zgvk3ka0op9IjgrH1pHa4Xi{mH*BZt24>6oiHKrv-#s=5GAPz|PIp+fum7UurPfH%N z@Z-exUKrHwWYk%fIpPYXS0o(gk@(l7r^R0kuwVF?ZO2g2H$SC(!T$gXbH`D{H|zc( z7yu2{P_f6k^0}<7YvG@Xbo)DruDo5WTS**c!p&_07Qo5C^8KkeUEbwJe5ckk{8RAf zU$&QA{{Rea{uRpj%g4G;h&1%Gvvz3&t08w>E&x1!Ij@#H3E>@M#$Fw_)R)Fu+)pzy z2mpt7%Ef=@pFD%oyBkk|zA1c`@ehk6!ODVBNB)bY$d^*N+t`o56Ce0V{CO8eT~}}f z=L%y%pUfKfjSu1nhhebM()daC%`|@IP`L``GZ`b-D#U&@i%)+h= z_K_qL&A9G9Y>1(x0k<#=PSVUqGHW8|;I6L%{ICpO8)@D z-|*SUH;fOVQ<|%J@qa)H!6ued*dl-R>*M>cg;&esds`;)p1&Qu#C+!ZP7c>&j@?ju z{NGyKUxByxMUpQP_@?a#2g<*bA54$sOObaiP4+tVaO zJ076)BAq|%{{Z5cN6)YLt;hRUY{&EORbd13e+tg?aj-B_OE?Wfc0O>cr4)G8UL)*t1`{{T#8&+AK(KBaR# zta{n_m!l9fE3edl_31z1WN5?wTesz2X=CsXeM-?MZDRf>IaZEY-*TSd z#gmKM>EW8+Od><}|5ZaL}8cjG4&N(s9u2Q#+Eu@8uvOn`vyMmp`N+u|mcm>|e~ zus_DQ=KY?mF197UrL5h8yhk0+Aam$F>h-_utu(-5ZE$uQud#vY)8D->XZ_)ONBpMq z{6?`nM;weZjFJGY*t|hv+H5NKmi}Q(6j@Z9`eQZ3+?*v(iwwL|XZ@815NO8#Kx@|l5XL-l^J6GyNG85}@t?t;?0*<|S53Z>_0s-kib*ae9&&9$;GxGu zhUXk&x+D8J=`&6i-hE2yU+$UyZk>8nG_18HHrvqp6ns_D-Ezq?k&ZA9DoDO5=!gLg zD<5osjd&z~vn7*_&jr(y)X8zz>w!)mvh9QQKJg8Tp^ay;nK#J8`-cPb#d01G*X(ET7l-Z|>L9IU4nT2`b_|c^KMLZ!Mf)_v zr1*aNb%OFRk+gx@VIWdE5;4=(usjLyAH&`$@Mf8)%w>w^<^`4G3<7h`2OT-B5?0la z+^)1e-rwTppKECxECCUXyM%+0QJ;%?F6^-dy8i&ITJl&wW&JJOkz+F{*VkusFK9_tUptv5)$ER#oYFhScO0RA;_{A$r-B*;|{r<%3rtNSA9 zFUR(U(DwO%!km9(Ef^@>s87=v;}mi({{Vnlk{sqI}e+`XR(&);t%@}oM z#zP!u^TlZxr1uk?t+DGr2nb(>S_={hDK0?leCHVczm0XWxaS9s*sdqw(MI@VqDdMR zW9M(&MCCIv(|2M;vkqH6)Hy3=H-)R#HxV z2S6*Gvq7$KNY6g?4guun@~5#Rob?^5BiFq}g?p1mgbV}6ZYpTx#z8$l&-m03OHN$eOUR;xb(>#iH2q5RLUu@J-5D($g6=8l-Ksg?@NKBD9I2}o+hT5kb z9Mm}J+r;2=Iog3nJgyEA6l3m%UT;vhw4A-JunU10oCX2}OiDYgc zaXcTU0sL#tJ}bsunAGAHpV{^I$E~hzANdxmHy_D@r2<7U^ zSIP-Ide(GEg5+gE!V}Zlv@T>jNUXS<%)DYw07m>OTP`T%e0wk&PNjj8V8gGLmRwON?M+4AXWBQ8Ke-Gwm zyxHi|$Ojk$@T?t5ZlfdHG@dWk?lfyyWQHJOX%!~9d=|*rarEwq8@{pVU?DQcP%B3!K0QJNNADoNs)h5otCl(yW^n*zEoF!GqPoy#dnLSY#rvC0=wS6A-aBH0Xy`kx;cc zWH_ka402j(-qeP-HjFesZY0Z^ck~N2iST(bF7xbxr3%mff`*2#<7s~7sgjWQ#6*i8 zC7ePo+ye(wB~c9)HO^C^VL#u#;rXFn+F;;a8H-igrpO0>LGAg+w=uNn^Z`a3=_+g^P)dZ6m8zzhEt6~YR_g_7=BNjobskiTse|TRLn`6H!A7yPh_(`h&(CDOsg`!MQaG{AE z*B~PLjh2YWvbh`wwm)oE!pQbB`9|%mSok4%5jf-1mLSd3X)U)*paFxEZ>n#d3UKfd za+80HiA|9IUC^N=Cr`Bg*dtCu^PN6{;`kvf{d}Kx2d8}cBf3SOrFD@$e(u8?EpO*; zsV@3wGO34S<>rkKq|lnG0~JS0-?JA3^TrlRI*i^0lnu~Zr7{%qaPiQDkxGD%?Z)%& z*tzeI^kN_0&eQNa0@Q%ZGvuC{Wnq!QkKQ+|H)K?0{;=e`SOd_kJ@@v;b2wf;YW2hq zI*!4s+UtVUd|j9NnKFh*pNqWmv)&tC?Q!5xPMbpm6sp!A8b^nr6O^fcb|j*V3|9)p z9=wtzF>)I&D2wPaE^@k5a3p@!C3KwI0P4950D>ltW)>(hWco}I0T7q9;V{1!86HAY z+q@Y~RHfF(>#@m#f`Z=CB#l4b%H839TUS}9m5RfbXa~>g5>c#^Tc%ay)lJxRJ96{H zWu|PP=wV(PbAm+R(8FuS?diMMt)Yw?L6RvN`M$xZMNeQ8rLL*Zt!NMWE1tV}IvxI$ zbaBUnY=`Ma#FQF$NDe>Ip0YdIS-f}*(dfzZGU5MtT{p)p&{T1k=B^w}{j{9uCg!Vm zLf)H4`>@COr;9+eq~ySUl#I~%xG#z43{ELydNmttWhVPq<&G1x)8i_WnR%d?Dq(%9E44=N~pV;?Y! zbqZ!X6?l@Xd;epcBA(cRaAMOm7I*(?wcNc`7wNd;K5LwvYBhWW4rcFOBQ#BI%O({!~S0ilF2{=&Q=3p`-^H`48j% zJlZSzYq;^PqF?S`)%v$$F~E5HtmL#cJU=5q=erft4D9RPtbo|igL;6Wbu8609G+xv zy$B`q>CV5HeuEXRLl~B#eenhYYhh(99QxeyqFC-`bp&-`V!5Dsh1HRJ-?8&^)osmg zG-uu)7j?00tgpR#Ju=9Ht;*ES0N0`?9hHT+#-8u`3kL4e@YhJDr_&in@P3q(s8fJ; z3x%q;N--asZXT5ed<<0FS-VYCJ5D{R{wW^PXqmTB-3ZzM6Jfg6OxKF|*vTi*!y>vh41ZV6T7But3 z%q6iEUre<8nC;MU_ z{=7S$h=G=3csE3RSR2NFO_k0U5+K*N^6g-K4$ZQ*+K9P6fmv)f>ZRo6zWBL8(ezEA zdZ;H-d(;5x=})8A#8;42EkpJnkxGapkSP>c#!mQy+zh9&MZYm1NjKwCPX^7ubSI3+ z0+kM^zl*d)nqL~|=}ua1J@&%`*~mu!@bA7C-aPKb-n(Bl|Fj@h6Pz-hU2qHVEFa&M zqHtkcVLkcQD(Ha6JY7mhnQfcz9>vKEA5Mdd`O&Kefs|Lq9CabLa(PoacYF}e@G?#S zG;BDtcL95-DAp_n!zr(4I%U;|sXpj^c_WaTI%0AwoLsq&ca|yS_FWZp1JC5FDYI(2 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

      L-={5O1)pY`Uns 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 W+f#lHQ3G2gg!OD6RZZZ>`2PTQFj{y3 literal 0 HcmV?d00001 diff --git a/specs/kbd/victor-s.jpg b/specs/kbd/victor-s.jpg new file mode 100644 index 0000000000000000000000000000000000000000..301f6399f82abc0c86fbe4c38cbdb93ce4fdb6f2 GIT binary patch literal 18071 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�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
      3uNeOTWsmd~?5e*m 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 nk+>>R?mRPPSmQrmCM`#6)l;ysZ2Wh;v|5 literal 0 HcmV?d00001 diff --git a/specs/kbd/xtkbd.jpg b/specs/kbd/xtkbd.jpg new file mode 100644 index 0000000000000000000000000000000000000000..220c848ae6a1fccfef376ac0e98bc4151f89d551 GIT binary patch literal 45613 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 literal 0 HcmV?d00001 diff --git a/specs/kbd/yahoo912.jpg b/specs/kbd/yahoo912.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0150d67c21ccca12bd2f53e61dd60f07686f8c13 GIT binary patch literal 29211 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

      p3tIyzq6b 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 Ovw!~o`A+a};eP?I>h$pd literal 0 HcmV?d00001 diff --git a/specs/sysv-abi-update.html/ch4.eheader.html b/specs/sysv-abi-update.html/ch4.eheader.html new file mode 100644 index 0000000..5ddd45b --- /dev/null +++ b/specs/sysv-abi-update.html/ch4.eheader.html @@ -0,0 +1,1184 @@ + +ELF Header +

      ELF Header

      +

      +Some object file control structures can grow, because the ELF header +contains their actual sizes. If the object file format changes, a program +may encounter control structures that are larger or smaller than expected. +Programs might therefore ignore ``extra'' information. The treatment of +``missing'' information depends on context and will be specified when and +if extensions are defined. +


      +Figure 4-3: ELF Header +

      +

      +#define EI_NIDENT 16
      +
      +typedef struct {
      +        unsigned char   e_ident[EI_NIDENT];
      +        Elf32_Half      e_type;
      +        Elf32_Half      e_machine;
      +        Elf32_Word      e_version;
      +        Elf32_Addr      e_entry;
      +        Elf32_Off       e_phoff;
      +        Elf32_Off       e_shoff;
      +        Elf32_Word      e_flags;
      +        Elf32_Half      e_ehsize;
      +        Elf32_Half      e_phentsize;
      +        Elf32_Half      e_phnum;
      +        Elf32_Half      e_shentsize;
      +        Elf32_Half      e_shnum;
      +        Elf32_Half      e_shstrndx;
      +} Elf32_Ehdr;
      +
      +typedef struct {
      +        unsigned char   e_ident[EI_NIDENT];
      +        Elf64_Half      e_type;
      +        Elf64_Half      e_machine;
      +        Elf64_Word      e_version;
      +        Elf64_Addr      e_entry;
      +        Elf64_Off       e_phoff;
      +        Elf64_Off       e_shoff;
      +        Elf64_Word      e_flags;
      +        Elf64_Half      e_ehsize;
      +        Elf64_Half      e_phentsize;
      +        Elf64_Half      e_phnum;
      +        Elf64_Half      e_shentsize;
      +        Elf64_Half      e_shnum;
      +        Elf64_Half      e_shstrndx;
      +} Elf64_Ehdr;
      +
      +
      +
      +

      +

      ELF Identification

      +

      +As mentioned above, ELF provides an object file framework to support +multiple processors, multiple data encodings, and multiple +classes of machines. To support this object file family, +the initial bytes of the file specify +how to interpret the file, independent of the processor on +which the inquiry is made and independent of the file's +remaining contents. +

      +The initial bytes of an ELF header (and an object file) correspond to +the e_ident member. +


      +Figure 4-4: e_ident[] Identification Indexes +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameValuePurpose
      EI_MAG00File identification
      EI_MAG11File identification
      EI_MAG22File identification
      EI_MAG33File identification
      EI_CLASS4File class
      EI_DATA5Data encoding
      EI_VERSION6File version
      EI_OSABI7Operating system/ABI identification
      EI_ABIVERSION8ABI version
      EI_PAD9Start of padding bytes
      EI_NIDENT16Size of e_ident[]
      +


      +

      +These indexes access bytes that hold the following values. +

      +
      EI_MAG0 to EI_MAG3
      +
      A file's first 4 bytes hold a ``magic number,'' identifying the file +as an ELF object file.
      +

      + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameValuePosition
      ELFMAG00x7fe_ident[EI_MAG0]
      ELFMAG1'E'e_ident[EI_MAG1]
      ELFMAG2'L'e_ident[EI_MAG2]
      ELFMAG3'F'e_ident[EI_MAG3]
      +

      +

      EI_CLASS
      +
      The next byte, e_ident[EI_CLASS], identifies the +file's class, or capacity.
      +

      + + + + + + + + + + + + + + + + + + + + + +
      NameValueMeaning
      ELFCLASSNONE0Invalid class
      ELFCLASS32132-bit objects
      ELFCLASS64264-bit objects
      +

      +The file format is designed to be portable among machines of various +sizes, without imposing the sizes of the largest machine on the +smallest. The class of the file defines the basic types +used by the data structures +of the object file container itself. The data contained in object file +sections may follow a different programming model. If so, the processor +supplement describes the model used. +

      +Class ELFCLASS32 supports machines with +32-bit architectures. It +uses the basic types defined in the table +labeled ``32-Bit Data Types.'' +

      +Class ELFCLASS64 supports machines with 64-bit +architectures. It uses the basic types defined in the table +labeled ``64-Bit Data Types.'' +

      +Other classes will be defined as necessary, with different basic types +and sizes for object file data. +

      EI_DATA
      +
      Byte e_ident[EI_DATA] specifies the +encoding of both the data structures used by object file container +and data contained in object file sections. +The following encodings are currently defined. +
      +

      + + + + + + + + + + + + + + + + + + + + + +
      NameValueMeaning
      ELFDATANONE0Invalid data encoding
      ELFDATA2LSB1See below
      ELFDATA2MSB2See below
      +

      +Other values are reserved and will be assigned to new +encodings as necessary. +

      +


      NOTE: +Primarily for the convenience of code that looks at the ELF +file at runtime, the ELF data structures are intended to have the +same byte order as that of the running program. +
      +
      EI_VERSION
      +
      Byte e_ident[EI_VERSION] specifies the +ELF header version +number. Currently, this value must be EV_CURRENT, +as explained above for e_version.
      +

      +

      EI_OSABI
      +
      Byte e_ident[EI_OSABI] identifies the +OS- or ABI-specific ELF extensions used by this file. +Some fields in other ELF structures have flags and values +that have operating system and/or ABI specific meanings; +the interpretation of those fields is determined by the value of this byte. +If the object file does not use any extensions, +it is recommended that this byte be set to 0. +If the value for this byte is 64 through 255, +its meaning depends on the value of the e_machine header member. +The ABI processor supplement for an architecture +can define its own associated set of values for this byte in this range. +If the processor supplement does not specify a set of values, +one of the following values shall be used, +where 0 can also be taken to mean unspecified. +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameValueMeaning
      ELFOSABI_NONE0No extensions or unspecified
      ELFOSABI_HPUX1Hewlett-Packard HP-UX
      ELFOSABI_NETBSD2NetBSD
      ELFOSABI_LINUX3Linux
      ELFOSABI_SOLARIS6Sun Solaris
      ELFOSABI_AIX7AIX
      ELFOSABI_IRIX8IRIX
      ELFOSABI_FREEBSD9FreeBSD
      ELFOSABI_TRU6410Compaq TRU64 UNIX
      ELFOSABI_MODESTO11Novell Modesto
      ELFOSABI_OPENBSD12Open BSD
      ELFOSABI_OPENVMS13Open VMS
      ELFOSABI_NSK14Hewlett-Packard Non-Stop Kernel
       64-255Architecture-specific value range
      +

      +

      +

      EI_ABIVERSION
      +
      Byte e_ident[EI_ABIVERSION] identifies the +version of the ABI to which the object is targeted. +This field is used to distinguish among incompatible versions +of an ABI. The interpretation of this version number +is dependent on the ABI identified by the EI_OSABI +field. If no values are specified for the EI_OSABI +field by the processor supplement or no version values are +specified for the ABI determined by a particular value of the +EI_OSABI byte, the value 0 shall +be used for the EI_ABIVERSION byte; it +indicates unspecified.
      +

      +

      EI_PAD
      +
      This value marks the beginning of the unused bytes in +e_ident. These bytes are reserved and set to zero; +programs that read object files +should ignore them. The value of EI_PAD will +change in the future if currently unused bytes are given +meanings.
      +
      +

      +A file's data encoding specifies how to interpret the basic objects +in a file. Class ELFCLASS32 files use objects +that occupy 1, 2, and 4 bytes. Class ELFCLASS64 files +use objects that occupy 1, 2, 4, and 8 bytes. Under the defined +encodings, objects are represented as shown below. +

      +Encoding ELFDATA2LSB specifies 2's complement values, +with the least significant byte occupying the lowest address. +


      +Figure 4-5: Data Encoding ELFDATA2LSB, byte address zero on the left +

      + + + + + +
      01
      0x01
      +

      + + + + + + +
      0201
      0x0102
      +

      + + + + + + + + +
      04030201
      0x01020304
      +

      + + + + + + + + + + + + +
      0807060504030201
      0x0102030405060708
      +


      +

      +Encoding ELFDATA2MSB specifies 2's complement values, +with the most significant byte occupying the lowest address. +


      +Figure 4-6: Data Encoding ELFDATA2MSB, byte address zero on the left +

      + + + + + +
      01
      0x01
      +

      + + + + + + +
      0102
      0x0102
      +

      + + + + + + + + +
      01020304
      0x01020304
      +

      + + + + + + + + + + + + +
      0102030405060708
      0x0102030405060708
      +


      +

      +

      +

      Machine Information (Processor-Specific)

      +

      +


      NOTE: +This section requires processor-specific information. +The ABI supplement for the desired processor describes the details. +
      +Previous +Contents +Next +
      + + +© 1997, 1998, 1999, 2000, 2001 The Santa Cruz Operation, Inc. All rights reserved. +© 2002 Caldera International. All rights reserved. + + + diff --git a/specs/sysv-abi-update.html/ch4.intro.html b/specs/sysv-abi-update.html/ch4.intro.html new file mode 100644 index 0000000..ccc81fd --- /dev/null +++ b/specs/sysv-abi-update.html/ch4.intro.html @@ -0,0 +1,252 @@ + +Chapter 4: Object Files +

      Introduction

      +This chapter describes the +object file format, called ELF (Executable and Linking Format). +There are three main types of object files. +
        +

      • +A relocatable file +holds code and data suitable for linking +with other object files to create an executable +or a shared object file. +

      • +An executable file +holds a program suitable for execution; +the file specifies how +exec(BA_OS) +creates a program's process image. +

      • +A +shared object file +holds code and data suitable for linking +in two contexts. +First, the link editor [see ld(BA_OS)] +processes the shared object file with other relocatable +and shared object files to create another object file. +Second, the dynamic linker combines it with an executable file and other +shared objects to create a process image. +
      +

      +Created by the assembler and link editor, object files are binary +representations of programs intended to be executed directly on +a processor. Programs that require other abstract machines, such +as shell scripts, are excluded. +

      +

      +After the introductory material, this chapter focuses on the file +format and how it pertains to building programs. Chapter 5 also +describes parts of the object file, concentrating on the information +necessary to execute a program. +

      + +

      File Format

      +Object files participate in program linking (building a program) +and program execution (running a program). For convenience and +efficiency, the object file format provides parallel views of a file's +contents, reflecting the differing needs of those activities. +Figure 4-1 shows an object file's organization. +


      +Figure 4-1: Object File Format +

      + + + + +
      + + + + + + + + + +
      Linking View
      ELF Header
      Program header table
      optional
      Section 1
      ...
      Section n
      ...
      Section header table
      required
      +
      + + + + + + + + + +
      Execution View
      ELF Header
      Program header table
      required
      Segment 1
      Segment 2
      Segment 3
      ...
      Section header table
      optional
      +
      +


      +

      +An ELF header resides at the beginning and +holds a ``road map'' +describing the file's organization. Sections hold the bulk +of object file information for the linking view: instructions, +data, symbol table, relocation information, and so on. +Descriptions of special sections appear later in the chapter. +Chapter 5 discusses segments and the program execution +view of the file. +

      +

      +A program header table tells the system how to create a process image. +Files used to build a process image (execute a program) +must have a program header table; relocatable files do not need one. +A section header table +contains information describing the file's sections. +Every section has an entry in the table; each entry +gives information such as the section name, the +section size, and so on. +Files used during linking must have a section header table; +other object files may or may not have one. +


      +NOTE: +Although the figure shows the program header table +immediately after the ELF header, and the section header table +following the sections, actual files may differ. +Moreover, sections and segments have no specified order. +Only the ELF header has a fixed position in the file. +

      + +

      Data Representation

      +As described here, the object file +format +supports various processors with 8-bit bytes +and either 32-bit or 64-bit architectures. +Nevertheless, it is intended to be extensible to larger +(or smaller) architectures. +Object files therefore represent some control data +with a machine-independent format, +making it possible to identify object files and +interpret their contents in a common way. +Remaining data in an object file +use the encoding of the target processor, regardless of +the machine on which the file was created. +


      +Figure 4-2: 32-Bit Data Types +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameSizeAlignmentPurpose
      Elf32_Addr44Unsigned program address
      Elf32_Off44Unsigned file offset
      Elf32_Half22Unsigned medium integer
      Elf32_Word44Unsigned integer
      Elf32_Sword44Signed integer
      unsigned char11Unsigned small integer
      +

      +64-Bit Data Types +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameSizeAlignmentPurpose
      Elf64_Addr88Unsigned program address
      Elf64_Off88Unsigned file offset
      Elf64_Half22Unsigned medium integer
      Elf64_Word44Unsigned integer
      Elf64_Sword44Signed integer
      Elf64_Xword88Unsigned long integer
      Elf64_Sxword88Signed long integer
      unsigned char11Unsigned small integer
      +

      +


      +All data structures that the object file format +defines follow the ``natural'' size and alignment guidelines +for the relevant class. +If necessary, data structures contain explicit padding to +ensure 8-byte alignment for 8-byte objects, +4-byte alignment for 4-byte objects, to force +structure sizes to a multiple of 4 or 8, and so forth. +Data also have suitable alignment from the beginning of the file. +Thus, for example, a structure containing an +Elf32_Addr +member will be aligned on a 4-byte boundary within the file. +

      +For portability reasons, ELF uses no bit-fields. +


      +Contents +Next +
      + + +© 1997, 1998, 1999, 2000, 2001 The Santa Cruz Operation, Inc. All rights reserved. + + + diff --git a/specs/sysv-abi-update.html/ch4.reloc.html b/specs/sysv-abi-update.html/ch4.reloc.html new file mode 100644 index 0000000..22996e1 --- /dev/null +++ b/specs/sysv-abi-update.html/ch4.reloc.html @@ -0,0 +1,180 @@ + +Relocation

      +

      Relocation

      +Relocation is the process of connecting symbolic references +with symbolic definitions. +For example, when a program calls a function, the associated call +instruction must transfer control to the proper destination address +at execution. +Relocatable files must have +``relocation entries'' which +are necessary because they contain information that +describes how to modify their section contents, thus allowing +executable and shared object files to hold +the right information for a process's program image. +


      +Figure 4-21: Relocation Entries +

      +

      +
      +typedef struct {
      +	Elf32_Addr	r_offset;
      +	Elf32_Word	r_info;
      +} Elf32_Rel;
      +
      +typedef struct {
      +	Elf32_Addr	r_offset;
      +	Elf32_Word	r_info;
      +	Elf32_Sword	r_addend;
      +} Elf32_Rela;
      +
      +typedef struct {
      +	Elf64_Addr	r_offset;
      +	Elf64_Xword	r_info;
      +} Elf64_Rel;
      +
      +typedef struct {
      +	Elf64_Addr	r_offset;
      +	Elf64_Xword	r_info;
      +	Elf64_Sxword	r_addend;
      +} Elf64_Rela;
      +
      +
      +
      +
      +

      r_offset
      +This member gives the location at which to apply the +relocation action. +For a relocatable file, +the value is the byte offset from the beginning of the section +to the storage unit affected by the relocation. +For an executable file or a shared object, +the value is the virtual address +of the storage unit affected by the relocation. +

      r_info
      +This member gives both the symbol table index with respect to which +the relocation must be made, and the type of relocation to apply. +For example, a call instruction's relocation entry +would hold the symbol table index of the function being called. +If the index is STN_UNDEF, +the undefined symbol index, +the relocation uses 0 as the ``symbol value''. +Relocation types are processor-specific; +descriptions of their behavior appear in the processor +supplement. +When the text below refers to a relocation entry's +relocation type or symbol table index, it means the result of applying +ELF32_R_TYPE (or ELF64_R_TYPE) or ELF32_R_SYM (or ELF64_R_SYM), +respectively, to the entry's r_info member. +
      +
      +	#define ELF32_R_SYM(i)	((i)>>8)
      +	#define ELF32_R_TYPE(i)   ((unsigned char)(i))
      +	#define ELF32_R_INFO(s,t) (((s)<<8)+(unsigned char)(t))
      +
      +	#define ELF64_R_SYM(i)    ((i)>>32)
      +	#define ELF64_R_TYPE(i)   ((i)&0xffffffffL)
      +	#define ELF64_R_INFO(s,t) (((s)<<32)+((t)&0xffffffffL))
      +
      +
      +

      r_addend
      +This member specifies a constant addend used to +compute the value to be stored into the relocatable field. +
      +

      +As specified previously, only +Elf32_Rela and Elf64_Rela +entries contain an explicit addend. +Entries of type Elf32_Rel and Elf64_Rel +store an implicit addend in the location to be modified. +Depending on the processor architecture, one form or the other +might be necessary or more convenient. +Consequently, an implementation for a particular machine +may use one form exclusively or either form depending on context. +

      +A relocation section references two other sections: +a symbol table and a section to modify. +The section header's sh_info and sh_link +members, described in +``Sections'' +above, specify these relationships. +Relocation entries for different object files have +slightly different interpretations for the +r_offset member. +

      +

        +

      • +In relocatable files, r_offset +holds a section offset. +The relocation section itself describes how to +modify another section in the file; relocation offsets +designate a storage unit within the second section. +

      • +In executable and shared object files, +r_offset holds a virtual address. +To make these files' relocation entries more useful +for the dynamic linker, the section offset (file interpretation) +gives way to a virtual address (memory interpretation). +
      +Although the interpretation of r_offset +changes for different object files to +allow efficient access by the relevant programs, +the relocation types' meanings stay the same. +

      + +The typical application of an ELF relocation is to determine the +referenced symbol value, extract the addend (either from the +field to be relocated or from the addend field contained in +the relocation record, as appropriate for the type of relocation +record), apply the expression implied by the relocation type +to the symbol and addend, extract the desired part of the expression +result, and place it in the field to be relocated. +

      +If multiple consecutive relocation records are applied +to the same relocation location (r_offset), +they are composed instead +of being applied independently, as described above. +By consecutive, we mean that the relocation records are +contiguous within a single relocation section. By composed, +we mean that the standard application described above is modified +as follows: +

        +
      • +In all but the last relocation operation of a composed sequence, +the result of the relocation expression is retained, rather +than having part extracted and placed in the relocated field. +The result is retained at full pointer precision of the +applicable ABI processor supplement. +

      • +In all but the first relocation operation of a composed sequence, +the addend used is the retained result of the previous relocation +operation, rather than that implied by the relocation type. +
      +

      +Note that a consequence of the above rules is that the location specified +by a relocation type is relevant for the +first element of a composed sequence (and then only for relocation +records that do not contain an explicit addend field) and for the +last element, where the location determines where the relocated value +will be placed. For all other relocation operands in a composed +sequence, the location specified is ignored. +

      +An ABI processor supplement may specify individual relocation types +that always stop a composition sequence, or always start a new one. + +

      Relocation Types (Processor-Specific)

      +
      +NOTE: +This section requires processor-specific information. The ABI +supplement for the desired processor describes the details. +
      +Previous +Contents +Next +
      + + +© 1997, 1998, 1999, 2000, 2001 The Santa Cruz Operation, Inc. All rights reserved. + + + diff --git a/specs/sysv-abi-update.html/ch4.sheader.html b/specs/sysv-abi-update.html/ch4.sheader.html new file mode 100644 index 0000000..ca7c737 --- /dev/null +++ b/specs/sysv-abi-update.html/ch4.sheader.html @@ -0,0 +1,1307 @@ + +Sections

      +

      Sections

      +An object file's section header table lets one +locate all the file's sections. +The section header table is an array of Elf32_Shdr +or Elf64_Shdr structures +as described below. +A section header table index is a subscript into this array. +The ELF header's e_shoff +member gives the byte offset from the beginning of the +file to the section header table. +e_shnum normally tells how many entries the section header table contains. +e_shentsize gives the size in bytes of each entry. +

      +If the number of sections is greater than or equal to +SHN_LORESERVE (0xff00), e_shnum +has the value SHN_UNDEF (0) and the +actual number of section header table +entries is contained in the sh_size field of +the section header at index 0 +(otherwise, the sh_size member of the initial entry +contains 0). +

      +Some section header table indexes are reserved in contexts +where index size is restricted, for example, the st_shndx +member of a symbol table entry and the e_shnum and +e_shstrndx members of the ELF header. +In such contexts, the reserved values do not represent actual +sections in the object file. Also in such contexts, an escape +value indicates that the actual section +index is to be found elsewhere, in a larger field. +


      +Figure 4-7: Special Section Indexes +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameValue
      SHN_UNDEF0
      SHN_LORESERVE0xff00
      SHN_LOPROC0xff00
      SHN_HIPROC0xff1f
      SHN_LOOS0xff20
      SHN_HIOS0xff3f
      SHN_ABS0xfff1
      SHN_COMMON0xfff2
      SHN_XINDEX0xffff
      SHN_HIRESERVE0xffff
      +


      +

      +

      +

      SHN_UNDEF
      +This value marks an undefined, missing, irrelevant, or +otherwise meaningless section reference. +For example, a symbol ``defined'' relative to section number +SHN_UNDEF is an undefined symbol. +
      +
      +NOTE: +Although index 0 is reserved as the undefined value, +the section header table contains an entry for index 0. +If the e_shnum +member of the ELF header says a file has 6 entries +in the section header table, they have the indexes 0 through 5. +The contents of the initial entry are specified later in this +section. +

      +

      +

      SHN_LORESERVE
      +This value specifies the lower bound of the +range of reserved indexes. +

      SHN_LOPROC through SHN_HIPROC
      +Values in this inclusive range +are reserved for processor-specific semantics. +

      SHN_LOOS through SHN_HIOS
      +Values in this inclusive range +are reserved for operating system-specific semantics. +

      SHN_ABS
      +This value specifies absolute values for the corresponding reference. +For example, symbols defined relative to section number SHN_ABS +have absolute values and are not affected by relocation. +

      SHN_COMMON
      +Symbols defined relative to this section are common symbols, +such as FORTRAN +COMMON +or unallocated C external variables. +

      SHN_XINDEX
      +This value is an escape value. +It indicates that the actual section header index is too large to fit +in the containing field and is to be found in another location +(specific to the structure where it appears). +

      SHN_HIRESERVE
      +This value specifies the upper bound of the +range of reserved indexes. +The system reserves indexes between SHN_LORESERVE +and SHN_HIRESERVE, +inclusive; the values do not reference the section header table. +The section header table does not +contain entries for the reserved indexes. +
      +

      +Sections contain all information in an object file +except the ELF header, the program header table, +and the section header table. +Moreover, object files' sections satisfy several conditions. +

        +

      • +Every section in an object file has exactly one +section header describing it. +Section headers may exist that do not have a section. +

      • +Each section occupies one contiguous (possibly empty) +sequence of bytes within a file. +

      • +Sections in a file may not overlap. +No byte in a file resides in more than one section. +

      • +An object file may have inactive space. +The various headers and the sections might not +``cover'' every byte in an object file. +The contents of the inactive data are unspecified. +
      +A section header has the following structure. +
      + +
      +Figure 4-8: Section Header
      +

      + +typedef struct { + Elf32_Word sh_name; + Elf32_Word sh_type; + Elf32_Word sh_flags; + Elf32_Addr sh_addr; + Elf32_Off sh_offset; + Elf32_Word sh_size; + Elf32_Word sh_link; + Elf32_Word sh_info; + Elf32_Word sh_addralign; + Elf32_Word sh_entsize; +} Elf32_Shdr; + +typedef struct { + Elf64_Word sh_name; + Elf64_Word sh_type; + Elf64_Xword sh_flags; + Elf64_Addr sh_addr; + Elf64_Off sh_offset; + Elf64_Xword sh_size; + Elf64_Word sh_link; + Elf64_Word sh_info; + Elf64_Xword sh_addralign; + Elf64_Xword sh_entsize; +} Elf64_Shdr; + +

      +
      +

      +

      +

      sh_name
      +This member specifies the name of the section. +Its value is an index into the section header +string table section [see +``String Table'' below], +giving the location of a null-terminated string. +

      sh_type
      +This member categorizes the section's contents and semantics. +Section types and their descriptions appear +below. +

      +

      sh_flags
      +Sections support 1-bit flags that describe miscellaneous attributes. +Flag definitions appear +below. +

      +

      sh_addr
      +If the section will appear in the memory image of a process, +this member gives the address at which the section's first +byte should reside. +Otherwise, the member contains 0. +

      sh_offset
      +This member's value gives the byte offset from the beginning of the file +to the first byte in the section. +One section type, SHT_NOBITS +described +below, +occupies no space in the file, and its +sh_offset member locates the conceptual placement in the file. +

      sh_size
      +This member gives the section's size in bytes. +Unless the section type is +SHT_NOBITS, the section occupies sh_size +bytes in the file. +A section of type SHT_NOBITS +may have a non-zero size, but it occupies no space in the file. +

      sh_link
      +This member holds a section header table index link, +whose interpretation depends on the section type. +A table below +describes the values. +

      sh_info
      +This member holds extra information, +whose interpretation depends on the section type. +A table below +describes the values. If the sh_flags field for this +section header includes the attribute SHF_INFO_LINK, then this member represents a section header table index. +

      sh_addralign
      +Some sections have address alignment constraints. +For example, if a section holds a doubleword, +the system must ensure doubleword alignment for the entire section. +The value of sh_addr +must be congruent to 0, modulo the value of sh_addralign. +Currently, only 0 and positive integral powers of two are allowed. +Values 0 and 1 mean the section has no alignment constraints. +

      sh_entsize
      +Some sections hold a table of fixed-size entries, +such as a symbol table. +For such a section, this member gives the size in bytes of each entry. +The member contains 0 if the section does not hold a table +of fixed-size entries. +
      +

      +A section header's sh_type member specifies the section's semantics. +


      + +Figure 4-9: Section Types,sh_type
      +
      e_ident
      +
      The initial bytes mark the file as an object file and +provide machine-independent +data with which to decode and interpret the file's contents. +Complete descriptions +appear below in ``ELF Identification''.
      +
      e_type
      +
      This member identifies the object file type.
      +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameValueMeaning
      ET_NONE0No file type
      ET_REL1Relocatable file
      ET_EXEC2Executable file
      ET_DYN3Shared object file
      ET_CORE4Core file
      ET_LOOS0xfe00Operating system-specific
      ET_HIOS0xfeffOperating system-specific
      ET_LOPROC0xff00Processor-specific
      ET_HIPROC0xffffProcessor-specific
      +

      +Although the core file contents are unspecified, +type ET_CORE +is reserved to mark the file. +Values from ET_LOOS +through ET_HIOS +(inclusive) are reserved for operating system-specific semantics. +Values from ET_LOPROC +through ET_HIPROC +(inclusive) are reserved for processor-specific semantics. If meanings +are specified, the processor supplement explains them. Other values are +reserved and will be assigned to new object file types as necessary. +

      +

      e_machine
      +
      This member's value specifies the required architecture for +an individual file.
      +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameValueMeaning
      EM_NONE0No machine
      EM_M321AT&T WE 32100
      EM_SPARC2SPARC
      EM_3863Intel 80386
      EM_68K4Motorola 68000
      EM_88K5Motorola 88000
      reserved6Reserved for future use (was EM_486)
      EM_8607Intel 80860
      EM_MIPS8MIPS I Architecture
      EM_S3709IBM System/370 Processor
      EM_MIPS_RS3_LE10MIPS RS3000 Little-endian
      reserved11-14Reserved for future use
      EM_PARISC15Hewlett-Packard PA-RISC
      reserved16Reserved for future use
      EM_VPP50017Fujitsu VPP500
      EM_SPARC32PLUS18Enhanced instruction set SPARC
      EM_96019Intel 80960
      EM_PPC20PowerPC
      EM_PPC642164-bit PowerPC
      EM_S39022IBM System/390 Processor
      reserved23-35Reserved for future use
      EM_V80036NEC V800
      EM_FR2037Fujitsu FR20
      EM_RH3238TRW RH-32
      EM_RCE39Motorola RCE
      EM_ARM40Advanced RISC Machines ARM
      EM_ALPHA41Digital Alpha
      EM_SH42Hitachi SH
      EM_SPARCV943SPARC Version 9
      EM_TRICORE44Siemens TriCore embedded processor
      EM_ARC45Argonaut RISC Core, Argonaut Technologies Inc.
      EM_H8_30046Hitachi H8/300
      EM_H8_300H47Hitachi H8/300H
      EM_H8S48Hitachi H8S
      EM_H8_50049Hitachi H8/500
      EM_IA_6450Intel IA-64 processor architecture
      EM_MIPS_X51Stanford MIPS-X
      EM_COLDFIRE52Motorola ColdFire
      EM_68HC1253Motorola M68HC12
      EM_MMA54Fujitsu MMA Multimedia Accelerator
      EM_PCP55Siemens PCP
      EM_NCPU56Sony nCPU embedded RISC processor
      EM_NDR157Denso NDR1 microprocessor
      EM_STARCORE58Motorola Star*Core processor
      EM_ME1659Toyota ME16 processor
      EM_ST10060STMicroelectronics ST100 processor
      EM_TINYJ61Advanced Logic Corp. TinyJ embedded processor family
      EM_X86_6462AMD x86-64 architecture
      EM_PDSP63Sony DSP Processor
      EM_PDP1064Digital Equipment Corp. PDP-10
      EM_PDP1165Digital Equipment Corp. PDP-11
      EM_FX6666Siemens FX66 microcontroller
      EM_ST9PLUS67STMicroelectronics ST9+ 8/16 bit microcontroller
      EM_ST768STMicroelectronics ST7 8-bit microcontroller
      EM_68HC1669Motorola MC68HC16 Microcontroller
      EM_68HC1170Motorola MC68HC11 Microcontroller
      EM_68HC0871Motorola MC68HC08 Microcontroller
      EM_68HC0572Motorola MC68HC05 Microcontroller
      EM_SVX73Silicon Graphics SVx
      EM_ST1974STMicroelectronics ST19 8-bit microcontroller
      EM_VAX75Digital VAX
      EM_CRIS76Axis Communications 32-bit embedded processor
      EM_JAVELIN77Infineon Technologies 32-bit embedded processor
      EM_FIREPATH78Element 14 64-bit DSP Processor
      EM_ZSP79LSI Logic 16-bit DSP Processor
      EM_MMIX80Donald Knuth's educational 64-bit processor
      EM_HUANY81Harvard University machine-independent object files
      EM_PRISM82SiTera Prism
      EM_AVR83Atmel AVR 8-bit microcontroller
      EM_FR3084Fujitsu FR30
      EM_D10V85Mitsubishi D10V
      EM_D30V86Mitsubishi D30V
      EM_V85087NEC v850
      EM_M32R88Mitsubishi M32R
      EM_MN1030089Matsushita MN10300
      EM_MN1020090Matsushita MN10200
      EM_PJ91picoJava
      EM_OPENRISC92OpenRISC 32-bit embedded processor
      EM_ARC_A593ARC Cores Tangent-A5
      EM_XTENSA94Tensilica Xtensa Architecture
      EM_VIDEOCORE95Alphamosaic VideoCore processor
      EM_TMM_GPP96Thompson Multimedia General Purpose Processor
      EM_NS32K97National Semiconductor 32000 series
      EM_TPC98Tenor Network TPC processor
      EM_SNP1K99Trebia SNP 1000 processor
      EM_ST200100STMicroelectronics (www.st.com) ST200 microcontroller
      +

      +Other values are reserved and will be assigned to new machines +as necessary. +Processor-specific ELF names use the machine name to distinguish them. +For example, the flags mentioned below use the +prefix EF_; +a flag named WIDGET for the EM_XYZ +machine would be called EF_XYZ_WIDGET. +

      e_version
      +
      This member identifies the object file version.
      +

      + + + + + + + + + + + + + + + + +
      NameValueMeaning
      EV_NONE0Invalid version
      EV_CURRENT1Current version
      +

      +The value 1 signifies the original file format; +extensions will create new versions with higher numbers. +Although the value of EV_CURRENT +is shown as 1 in the previous table, it will +change as necessary to reflect the current version number. +

      e_entry
      +
      This member gives the virtual address to which the +system first transfers +control, thus starting the process. If the file has no associated entry +point, this member holds zero.
      +
      e_phoff
      +
      This member holds the program header table's file offset in bytes. +If the file has no program header table, this member holds zero.
      +
      e_shoff
      +
      This member holds the section header table's file offset in bytes. +If the file has no section header table, this member holds zero.
      +
      e_flags
      +
      This member holds processor-specific flags associated with the file. +Flag names take the form +EF_machine_flag.
      +
      e_ehsize
      +
      This member holds the ELF header's size in bytes.
      +
      e_phentsize
      +
      This member holds the size in bytes of one entry in the file's program +header table; all entries are the same size.
      +
      e_phnum
      +
      This member holds the number of entries in the program header table. +Thus the product of +e_phentsize and e_phnum gives the +table's size in bytes. +If a file has no program header table, e_phnum +holds the value zero.
      +
      e_shentsize
      +
      This member holds a section header's size in bytes. A section header +is one entry in the section header table; all entries are the same size. +
      +
      e_shnum
      + +
      This member holds the number of entries in the section header table. +Thus the product of e_shentsize and +e_shnum gives the +section header table's size in bytes. +If a file has no section header table, +e_shnum holds the value zero. +

      +If the number of sections is greater than or equal to +SHN_LORESERVE (0xff00), this member +has the value zero and the actual number of section header table +entries is contained in the sh_size field of +the section header at index 0. +(Otherwise, the sh_size member of the initial entry +contains 0.) +

      +
      e_shstrndx
      +
      This member holds the section header table index of the +entry associated with the section name string table. +If the file has no section name string +table, this member holds the value SHN_UNDEF. +See ``Sections'' +and ``String Table'' below +for more information. +

      +If the section name string table section index is greater than or equal to +SHN_LORESERVE (0xff00), this member +has the value SHN_XINDEX (0xffff) and the +actual index of the section name string table section +is contained in the sh_link field of +the section header at index 0. +(Otherwise, the sh_link member of the initial entry +contains 0.) +

      +
      +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameValue
      SHT_NULL0
      SHT_PROGBITS1
      SHT_SYMTAB2
      SHT_STRTAB3
      SHT_RELA4
      SHT_HASH5
      SHT_DYNAMIC6
      SHT_NOTE7
      SHT_NOBITS8
      SHT_REL9
      SHT_SHLIB10
      SHT_DYNSYM11
      SHT_INIT_ARRAY14
      SHT_FINI_ARRAY15
      SHT_PREINIT_ARRAY16
      SHT_GROUP17
      SHT_SYMTAB_SHNDX18
      SHT_LOOS0x60000000
      SHT_HIOS0x6fffffff
      SHT_LOPROC0x70000000
      SHT_HIPROC0x7fffffff
      SHT_LOUSER0x80000000
      SHT_HIUSER0xffffffff
      +


      +

      +

      +

      SHT_NULL
      +This value marks the section header as inactive; +it does not have an associated section. +Other members of the section header have undefined values. +

      SHT_PROGBITS
      +The section holds information defined by the program, +whose format and meaning are determined solely by the program. +

      SHT_SYMTAB and SHT_DYNSYM
      +These sections hold a symbol table. +Currently, an object file may have only one section of each type, +but this restriction may be relaxed in the future. +Typically, SHT_SYMTAB +provides symbols for link editing, though it may also be +used for dynamic linking. +As a complete symbol table, it may contain many symbols unnecessary +for dynamic linking. +Consequently, an object file may also contain a SHT_DYNSYM +section, which holds a minimal set of dynamic linking symbols, +to save space. +See ``Symbol Table'' below +for details. +

      SHT_STRTAB
      +The section holds a string table. +An object file may have multiple string table sections. +See ``String Table'' +below for details. +

      SHT_RELA
      +The section holds relocation entries +with explicit addends, such as type +Elf32_Rela for the 32-bit class of object files +or type Elf64_Rela for the 64-bit class of object files. +An object file may have multiple relocation sections. +``Relocation'' +below for details. +

      SHT_HASH
      +The section holds a symbol hash table. +Currently, an object file may have only one hash table, +but this restriction may be relaxed in the future. +See +``Hash Table'' +in the Chapter 5 for details. +

      SHT_DYNAMIC
      +The section holds information for dynamic linking. +Currently, an object file may have only one dynamic section, +but this restriction may be relaxed in the future. +See +``Dynamic Section'' +in Chapter 5 for details. +

      SHT_NOTE
      +The section holds information that marks the file in some way. +See +``Note Section'' +in Chapter 5 for details. +

      SHT_NOBITS
      +A section of this type occupies no space in the file but +otherwise resembles +SHT_PROGBITS. +Although this section contains no bytes, the sh_offset +member contains the conceptual file offset. +

      SHT_REL
      +The section holds relocation entries +without explicit addends, such as type +Elf32_Rel for the 32-bit class of object files or +type Elf64_Rel for the 64-bit class of object files. +An object file may have multiple relocation sections. +See ``Relocation'' +below for details. +

      SHT_SHLIB
      +This section type is reserved but has unspecified semantics. + +

      SHT_INIT_ARRAY
      +This section contains an array of pointers to initialization functions, +as described in ``Initialization and +Termination Functions'' in Chapter 5. Each pointer in the array +is taken as a parameterless procedure with a void return. +

      SHT_FINI_ARRAY
      +This section contains an array of pointers to termination functions, +as described in ``Initialization and +Termination Functions'' in Chapter 5. Each pointer in the array +is taken as a parameterless procedure with a void return. +

      SHT_PREINIT_ARRAY
      +This section contains an array of pointers to functions that are +invoked before all other initialization functions, +as described in ``Initialization and +Termination Functions'' in Chapter 5. Each pointer in the array +is taken as a parameterless procedure with a void return. +

      SHT_GROUP
      +This section defines a section group. A section group +is a set of sections that are related and that must be treated +specially by the linker (see below for further +details). Sections of type SHT_GROUP may appear only +in relocatable objects (objects with the ELF header e_type +member set to ET_REL). The section header table entry +for a group section must appear in the section header table +before the entries for any of the sections that are members of +the group. +

      SHT_SYMTAB_SHNDX
      + +This section is associated with a section of type SHT_SYMTAB +and is required if any of the section header indexes referenced +by that symbol table contain the escape value SHN_XINDEX. +The section is an array of Elf32_Word values. +Each value corresponds one to one with a symbol table entry +and appear in the same order as those entries. +The values represent the section header indexes against which +the symbol table entries are defined. +Only if corresponding symbol table entry's st_shndx field +contains the escape value SHN_XINDEX +will the matching Elf32_Word hold the actual section header index; +otherwise, the entry must be SHN_UNDEF (0). +

      SHT_LOOS through SHT_HIOS
      +Values in this inclusive range +are reserved for operating system-specific semantics. +

      SHT_LOPROC through SHT_HIPROC
      +Values in this inclusive range +are reserved for processor-specific semantics. +

      SHT_LOUSER
      +This value specifies the lower bound of the range of +indexes reserved for application programs. +

      SHT_HIUSER
      +This value specifies the upper bound of the range of +indexes reserved for application programs. +Section types between SHT_LOUSER and +SHT_HIUSER may be used by the application, without conflicting with +current or future system-defined section types. +
      +

      +Other section type values are reserved. +As mentioned before, the section header for index 0 (SHN_UNDEF) +exists, even though the index marks undefined section references. +This entry holds the following. +


      +Figure 4-10: Section Header Table Entry:Index 0 +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameValueNote
      sh_name0No name
      sh_typeSHT_NULLInactive
      sh_flags0No flags
      sh_addr0No address
      sh_offset0No offset
      sh_sizeUnspecifiedIf non-zero, the actual number of section header entries
      sh_linkUnspecifiedIf non-zero, the index of the section header string table section
      sh_info0No auxiliary information
      sh_addralign0No alignment
      sh_entsize0No entries
      +


      +

      +A section header's sh_flags +member holds 1-bit flags that describe the section's attributes. +Defined values appear in the following table; +other values are reserved. + +


      +Figure 4-11: Section Attribute Flags +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameValue
      SHF_WRITE0x1
      SHF_ALLOC0x2
      SHF_EXECINSTR0x4
      SHF_MERGE0x10
      SHF_STRINGS0x20
      SHF_INFO_LINK0x40
      SHF_LINK_ORDER0x80
      SHF_OS_NONCONFORMING0x100
      SHF_GROUP0x200
      SHF_TLS0x400
      SHF_MASKOS0x0ff00000
      SHF_MASKPROC0xf0000000
      +


      +

      +If a flag bit is set in sh_flags, +the attribute is ``on'' for the section. +Otherwise, the attribute is ``off'' or does not apply. +Undefined attributes are set to zero. +

      +

      SHF_WRITE
      +The section contains data that should be writable during +process execution. +

      SHF_ALLOC
      +The section occupies memory during process execution. +Some control sections do not reside in the memory image +of an object file; this attribute is off for those sections. +

      SHF_EXECINSTR
      +The section contains executable machine instructions. + +

      SHF_MERGE
      +The data in the section may be merged to eliminate duplication. +Unless the SHF_STRINGS flag is also set, +the data elements in the section are of a uniform size. +The size of each element is specified in the section +header's sh_entsize field. +If the SHF_STRINGS flag is also set, +the data elements consist of null-terminated character strings. +The size of each character is specified in the section +header's sh_entsize field. +

      +Each element in the section is compared against other elements +in sections with the same name, type and flags. +Elements that would have identical values at program run-time +may be merged. +Relocations referencing elements of such sections must be +resolved to the merged locations of the referenced values. +Note that any relocatable values, including +values that would result in run-time relocations, must be +analyzed to determine whether the run-time values would actually +be identical. An ABI-conforming object file may not depend +on specific elements being merged, and an ABI-conforming +link editor may choose not to merge specific elements. + +

      SHF_STRINGS
      +The data elements in the section consist of null-terminated character +strings. The size of each character is specified in the section +header's sh_entsize field. + +

      SHF_INFO_LINK
      +The sh_info field of this section header holds a section +header table index. + +

      SHF_LINK_ORDER
      +This flag adds special ordering requirements for link editors. +The requirements apply if the +sh_link field of this section's header references +another section (the linked-to section). +If this section is combined with other +sections in the output file, it must appear in the same +relative order with respect to those sections, as the linked-to section +appears with respect to sections the linked-to section is combined with. +

      +


      +NOTE: +A typical use of this flag is to build a table that references text or +data sections in address order. +
      + +

      SHF_OS_NONCONFORMING
      +This section requires special OS-specific processing +(beyond the standard linking rules) +to avoid incorrect behavior. +If this section has either an sh_type value +or contains sh_flags bits in the OS-specific ranges for +those fields, and a link editor processing this section does not +recognize those values, then the link editor should reject +the object file containing this section with an error. +

      SHF_GROUP
      +This section is a member (perhaps the only one) of a section group. +The section must be referenced by a section of type SHT_GROUP. +The SHF_GROUP flag may be set only for sections contained +in relocatable objects (objects with the ELF header e_type +member set to ET_REL). +See below for further details. + +

      SHF_TLS
      +This section holds Thread-Local Storage, +meaning that each separate execution flow +has its own distinct instance of this data. +Implementations need not support this flag. +

      SHF_MASKOS
      +All bits included in this mask +are reserved for operating system-specific semantics. +

      SHF_MASKPROC
      +All bits included in this mask +are reserved for processor-specific semantics. +If meanings are specified, the processor supplement explains +them. +
      +

      +Two members in the section header, +sh_link and sh_info, +hold special information, depending on section type. +


      + +Figure 4-12: sh_link and sh_info Interpretation +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      sh_typesh_linksh_info
      SHT_DYNAMICThe section header index of +the string table used by +entries in the section.0
      SHT_HASHThe section header index of +the symbol table to which +the hash table applies.0
      SHT_REL
      SHT_RELA
      The section header index of +the associated symbol table.The section header index of +the section to which the +relocation applies.
      SHT_SYMTAB
      SHT_DYNSYM
      The section header index of +the associated string table.One greater than the symbol table index of the last local +symbol (binding STB_LOCAL).
      SHT_GROUPThe section header index of +the associated symbol table.The symbol table index of an entry in the +associated symbol table. The name of the specified symbol table +entry provides a signature for the section group.
      SHT_SYMTAB_SHNDXThe section header index of +the associated symbol table section.0
      +


      + +

      Rules for Linking Unrecognized Sections

      +If a link editor encounters sections whose headers contain OS-specific +values it does not recognize in the sh_type +or sh_flags fields, the link editor should combine those +sections as described below. +

      +If the section's sh_flags bits include the attribute +SHF_OS_NONCONFORMING, then the section requires +special knowledge to be correctly processed, and the link editor should +reject the object containing the section with an error. +

      +Unrecognized sections that do not have the +SHF_OS_NONCONFORMING attribute, are combined in a two-phase +process. As the link editor combines sections using this process, +it must honor the alignment constraints of the +input sections (asserted by the sh_addralign field), +padding between sections with zero bytes, if necessary, and producing +a combination with the maximum alignment constraint of its +component input sections. +

      +

        +
      1. +In the first phase, input sections that match in name, type +and attribute flags should be concatenated into single sections. +The concatenation order should satisfy the requirements of +any known input section attributes (e.g, SHF_MERGE +and SHF_LINK_ORDER). When not otherwise constrained, +sections should be emitted in input order. +
      2. +In the second phase, sections should be assigned to segments or +other units based on their attribute flags. Sections of each particular +unrecognized type should be assigned to the same unit unless +prevented by incompatible flags, and within a unit, sections +of the same unrecognized type should be placed together +if possible. +
      +

      +Non OS-specific processing (e.g. relocation) should be applied +to unrecognized section types. An output section header table, +if present, should contain entries for unknown sections. +Any unrecognized section attribute flags should be removed. +


      +NOTE: +It is recommended that link editors follow the same two-phase +ordering approach described above when linking sections of +known types. Padding between such sections may have values +different from zero, where appropriate. +
      + +

      Section Groups

      +Some sections occur in interrelated groups. For example, an out-of-line +definition of an inline function might require, in addition to the +section containing its executable instructions, a read-only data +section containing literals referenced, one or more debugging information +sections and other informational sections. Furthermore, there may be +internal references among these sections that would not make sense +if one of the sections were removed or replaced by a duplicate from +another object. Therefore, such groups must be +included or omitted from the linked object as a unit. +A section cannot be a member of more than one group. +

      +A section of type SHT_GROUP defines such a grouping +of sections. The name of a symbol from one of the containing +object's symbol tables provides a signature for the section group. +The section header of the SHT_GROUP section specifies +the identifying symbol entry, as described above: +the sh_link member contains the section header index +of the symbol table section that contains the entry. +The sh_info member contains the symbol table index of +the identifying entry. The sh_flags +member of the section header contains 0. +The name of the section (sh_name) is not specified. +

      +The referenced signature symbol is not restricted. +Its containing symbol table section need not be a member of the group, +for example. +

      +The section data of a SHT_GROUP section is an array +of Elf32_Word entries. The first entry is a flag word. +The remaining entries are a sequence of section header indices. +

      +The following flags are currently defined: +


      + +Figure 4-13: Section Group Flags +

      + + + + + + + + + + + + + + + +
      NameValue
      GRP_COMDAT0x1
      GRP_MASKOS0x0ff00000
      GRP_MASKPROC0xf0000000
      +


      +
      +

      GRP_COMDAT
      +This is a COMDAT group. It may duplicate another COMDAT group +in another object file, where duplication is defined as having the +same group signature. In such cases, only one of the +duplicate groups may be retained by the linker, and the +members of the remaining groups must be discarded. +

      GRP_MASKOS
      +All bits included in this mask +are reserved for operating system-specific semantics. +

      GRP_MASKPROC
      +All bits included in this mask +are reserved for processor-specific semantics. +If meanings are specified, the processor supplement explains +them. +
      +

      +The section header indices in the SHT_GROUP section +identify the sections that make up the group. Each such section +must have the SHF_GROUP flag set in its sh_flags +section header member. If the linker decides to remove the section +group, it must remove all members of the group. +


      +NOTE: +This requirement is not intended to imply that special case behavior +like removing debugging information requires removing the sections +to which that information refers, even if they are part of the same +group. +
      +

      + +To facilitate removing a group without leaving dangling references +and with only minimal processing of the symbol table, +the following rules must be followed: +

        +

      • +A symbol table entry with STB_GLOBAL or STB_WEAK +binding that is defined relative to one of a group's sections, +and that is contained in a symbol table section +that is not part of the group, +must be converted to an undefined symbol +(its section index must be changed to SHN_UNDEF) +if the group members are discarded. +References to this symbol table entry from outside the group are allowed. +

      • +A symbol table entry with STB_LOCAL binding +that is defined relative to one of a group's sections, +and that is contained in a symbol table section +that is not part of the group, +must be discarded if the group members are discarded. +References to this symbol table entry from outside the group are not allowed. +

      • +An undefined symbol that is referenced only from one or more sections +that are part of a particular group, +and that is contained in a symbol table section +that is not part of the group, +is not removed when the group members are discarded. +In other words, +the undefined symbol is not removed +even if no references to that symbol remain. +

      • +There may not be non-symbol references to the sections comprising +a group from outside the group, for example, use of a group +member's section header index in an sh_link or +sh_info member. +
      + +

      Special Sections

      +Various sections hold program and control information. +

      +The following table +shows sections that are used by the system +and have the indicated types and attributes. +


      +Figure 4-14: Special Sections +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameTypeAttributes
      .bss SHT_NOBITS SHF_ALLOC+SHF_WRITE
      .comment SHT_PROGBITSnone
      .data SHT_PROGBITSSHF_ALLOC+SHF_WRITE
      .data1 SHT_PROGBITSSHF_ALLOC+SHF_WRITE
      .debug SHT_PROGBITSnone
      .dynamic SHT_DYNAMIC see below
      .dynstr SHT_STRTAB SHF_ALLOC
      .dynsym SHT_DYNSYM SHF_ALLOC
      .fini SHT_PROGBITSSHF_ALLOC+SHF_EXECINSTR
      .fini_array SHT_FINI_ARRAYSHF_ALLOC+SHF_WRITE
      .got SHT_PROGBITSsee below
      .hash SHT_HASH SHF_ALLOC
      .init SHT_PROGBITSSHF_ALLOC+SHF_EXECINSTR
      .init_array SHT_INIT_ARRAYSHF_ALLOC+SHF_WRITE
      .interp SHT_PROGBITSsee below
      .line SHT_PROGBITSnone
      .note SHT_NOTE none
      .plt SHT_PROGBITSsee below
      .preinit_array SHT_PREINIT_ARRAYSHF_ALLOC+SHF_WRITE
      .relname SHT_REL see below
      .relaname SHT_RELA see below
      .rodata SHT_PROGBITSSHF_ALLOC
      .rodata1 SHT_PROGBITSSHF_ALLOC
      .shstrtab SHT_STRTAB none
      .strtab SHT_STRTAB see below
      .symtab SHT_SYMTAB see below
      .symtab_shndxSHT_SYMTAB_SHNDX see below
      .tbss SHT_NOBITSSHF_ALLOC+SHF_WRITE+SHF_TLS
      .tdata SHT_PROGBITSSHF_ALLOC+SHF_WRITE+SHF_TLS
      .tdata1 SHT_PROGBITSSHF_ALLOC+SHF_WRITE+SHF_TLS
      .text SHT_PROGBITSSHF_ALLOC+SHF_EXECINSTR
      +


      +

      +

      +

      .bss
      +This section holds uninitialized data that contribute +to the program's memory image. +By definition, the system initializes the data with zeros +when the program begins to run. +The section occupies no file space, as indicated by the section type, +SHT_NOBITS. +

      .comment
      +This section holds version control information. +

      .data and .data1
      +These sections hold initialized data that contribute +to the program's memory image. +

      .debug
      +This section holds information for symbolic debugging. +The contents are unspecified. All section names with the +prefix .debug are reserved for future use in the +ABI. +

      .dynamic
      +This section holds dynamic linking information. +The section's attributes will include the SHF_ALLOC bit. +Whether the SHF_WRITE bit is set is processor specific. +See Chapter 5 for more information. +

      .dynstr
      +This section holds strings needed for dynamic linking, +most commonly the strings +that represent the names associated with symbol table entries. +See Chapter 5 for more information. +

      .dynsym
      +This section holds the dynamic linking symbol table, +as described in +``Symbol Table''. +See Chapter 5 for more information. +

      .fini
      +This section holds executable instructions that contribute +to the process termination code. +That is, when a program exits normally, the system arranges +to execute the code in this section. +

      .fini_array
      +This section holds an array of function pointers that contributes +to a single termination array for the executable or shared +object containing the section. +

      .got
      +This section holds the global offset table. +See ``Coding Examples'' in Chapter 3, ``Special Sections'' in +Chapter 4, and ``Global Offset Table'' in Chapter 5 of the +processor supplement for more information. +

      .hash
      +This section holds a symbol hash table. +See +``Hash Table'' +in Chapter 5 for more information. +

      .init
      +This section holds executable instructions that contribute +to the process initialization code. +When a program starts to run, the system arranges +to execute the code in this section before calling the +main program entry point (called main for C programs). +

      .init_array
      +This section holds an array of function pointers that contributes +to a single initialization array for the executable or shared +object containing the section. +

      .interp
      +This section holds the path name of a program interpreter. +If the file has a loadable segment that includes +relocation, the sections' attributes will include the +SHF_ALLOC bit; otherwise, that bit will be off. +See Chapter 5 for more information. +

      .line
      +This section holds line number information for symbolic +debugging, which describes +the correspondence between the source program and the +machine code. +The contents are unspecified. +

      .note
      +This section holds information in the format that +``Note Section''. +in Chapter 5 describes. +

      .plt
      +This section holds the procedure linkage table. +See ``Special Sections'' in Chapter 4 and ``Procedure Linkage +Table'' in Chapter 5 of the processor supplement for more +information. +

      .preinit_array
      +This section holds an array of function pointers that contributes +to a single pre-initialization array for the executable or shared +object containing the section. +

      .relname and .relaname
      +These sections hold relocation information, as described in +``Relocation''. +If the file has a loadable segment that includes +relocation, the sections' attributes will include the +SHF_ALLOC bit; otherwise, that bit will be off. +Conventionally, name +is supplied by the section to which the relocations apply. +Thus a relocation section for .text +normally would have the name .rel.text or .rela.text. +

      .rodata and .rodata1
      +These sections hold read-only data that +typically contribute to a non-writable segment +in the process image. +See +``Program Header'' +in Chapter 5 for more information. +

      .shstrtab
      +This section holds section names. +

      .strtab
      +This section holds strings, most commonly the strings +that represent the names associated with symbol table entries. +If the file has a loadable segment that includes the +symbol string table, the section's attributes will include the +SHF_ALLOC +bit; otherwise, that bit will be off. +

      .symtab
      +This section holds a symbol table, as +``Symbol Table''. +in this chapter describes. +If the file has a loadable segment that includes the +symbol table, the section's attributes will include the +SHF_ALLOC bit; otherwise, that bit will be off. +

      .symtab_shndx
      +This section holds the special symbol table section index +array, as described above. The section's attributes will include +the SHF_ALLOC bit if the associated symbol table +section does; otherwise that bit will be off. + +

      .tbss
      +This section holds uninitialized thread-local data that contribute +to the program's memory image. +By definition, +the system initializes the data with zeros +when the data is instantiated for each new execution flow. +The section occupies no file space, as indicated by the section type, +SHT_NOBITS. +Implementations need not support thread-local storage. + +

      .tdata
      +This section holds initialized thread-local data that contributes +to the program's memory image. +A copy of its contents is instantiated by the system +for each new execution flow. +Implementations need not support thread-local storage. +

      .text
      +This section holds the ``text,'' or executable +instructions, of a program. +
      +

      +Section names with a dot (.) prefix +are reserved for the system, +although applications may use these sections +if their existing meanings are satisfactory. +Applications may use names without the prefix to +avoid conflicts with system sections. +The object file format lets one define sections not +shown in the previous list. +An object file may have more than one section +with the same name. +

      +Section names reserved for a processor architecture +are formed by placing an abbreviation of the architecture +name ahead of the section name. +The name should be taken from the +architecture names used for e_machine. +For instance .FOO.psect is the psect +section defined by the FOO architecture. +Existing extensions are called by their historical names. +

      + + + + + + + + + + + + + + + + + + + + + +
      Pre-existing Extensions
      .sdata.tdesc
      .sbss.lit4
      .lit8.reginfo
      .gptab.liblist
      .conflict
      +


      +NOTE: +For information on processor-specific sections, +see the ABI supplement for the desired processor. +
      +Previous +Contents +Next +
      + + +© 1997, 1998, 1999, 2000, 2001 The Santa Cruz Operation, Inc. All rights reserved. + + + diff --git a/specs/sysv-abi-update.html/ch4.strtab.html b/specs/sysv-abi-update.html/ch4.strtab.html new file mode 100644 index 0000000..6915c0c --- /dev/null +++ b/specs/sysv-abi-update.html/ch4.strtab.html @@ -0,0 +1,124 @@ + +String Table

      +

      String Table

      +String table sections hold null-terminated character sequences, +commonly called strings. +The object file uses these strings to represent symbol and section names. +One references a string as an index into the +string table section. +The first byte, which is index zero, is defined to hold +a null character. +Likewise, a string table's last byte is defined to hold +a null character, ensuring null termination for all strings. +A string whose index is zero specifies +either no name or a null name, depending on the context. +An empty string table section is permitted; its section header's sh_size +member would contain zero. +Non-zero indexes are invalid for an empty string table. +

      +A section header's sh_name +member holds an index into the section header string table +section, as designated by the e_shstrndx +member of the ELF header. +The following figures show a string table with 25 bytes +and the strings associated with various indexes. +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Index+0+1+2+3+4+5+6+7+8+9
      0\0name.\0Var
      10iable\0able
      20\0\0xx\0 
      +


      +Figure 4-15: String Table Indexes +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      IndexString
      0none
      1name.
      7Variable
      11able
      16able
      24null string
      +


      +

      +As the example shows, a string table index may refer +to any byte in the section. +A string may appear more than once; +references to substrings may exist; +and a single string may be referenced multiple times. +Unreferenced strings also are allowed. +


      +Previous +Contents +Next +
      + + +© 1997, 1998, 1999, 2000, 2001 The Santa Cruz Operation, Inc. All rights reserved. + + + diff --git a/specs/sysv-abi-update.html/ch4.symtab.html b/specs/sysv-abi-update.html/ch4.symtab.html new file mode 100644 index 0000000..c1031c7 --- /dev/null +++ b/specs/sysv-abi-update.html/ch4.symtab.html @@ -0,0 +1,592 @@ + +Symbol Table

      +

      Symbol Table

      +An object file's symbol table holds information +needed to locate and relocate a program's symbolic +definitions and references. +A symbol table index is a subscript into this array. +Index 0 both designates the first entry in the table +and serves as the undefined symbol index. The contents of the +initial entry are specified later in this section. +

      + + + + + + + +
      NameValue
      STN_UNDEF0
      +

      +A symbol table entry has the following format. +


      +Figure 4-16: Symbol Table Entry +

      +

      +
      +typedef struct {
      +	Elf32_Word	st_name;
      +	Elf32_Addr	st_value;
      +	Elf32_Word	st_size;
      +	unsigned char	st_info;
      +	unsigned char	st_other;
      +	Elf32_Half	st_shndx;
      +} Elf32_Sym;
      +
      +typedef struct {
      +	Elf64_Word	st_name;
      +	unsigned char	st_info;
      +	unsigned char	st_other;
      +	Elf64_Half	st_shndx;
      +	Elf64_Addr	st_value;
      +	Elf64_Xword	st_size;
      +} Elf64_Sym;
      +
      + +
      +

      +

      +

      st_name
      +This member holds an index into the object file's +symbol string table, which +holds the character representations of the symbol names. +If the value is non-zero, it represents a string table +index that gives the symbol name. +Otherwise, the symbol table entry has no name. +
      +
      +NOTE: +External C symbols have the same names in C +and object files' symbol tables. +

      +

      +

      st_value
      +This member gives the value of the associated symbol. +Depending on the context, this may be an absolute value, +an address, and so on; details appear below. +

      st_size
      +Many symbols have associated sizes. +For example, a data object's size is the number +of bytes contained in the object. +This member holds 0 if the symbol has no size or an unknown size. +

      st_info
      +This member specifies the symbol's type and binding attributes. +A list of the values and meanings appears below. +The following code shows how to manipulate the values for +both 32 and 64-bit objects. +
      +
      +   #define ELF32_ST_BIND(i)   ((i)>>4)
      +   #define ELF32_ST_TYPE(i)   ((i)&0xf)
      +   #define ELF32_ST_INFO(b,t) (((b)<<4)+((t)&0xf))
      +
      +   #define ELF64_ST_BIND(i)   ((i)>>4)
      +   #define ELF64_ST_TYPE(i)   ((i)&0xf)
      +   #define ELF64_ST_INFO(b,t) (((b)<<4)+((t)&0xf))
      +
      +
      + +

      st_other
      +This member currently specifies a symbol's visibility. +A list of the values and meanings appears below. +The following code shows how to manipulate the values for +both 32 and 64-bit objects. Other bits contain 0 and have +no defined meaning. +
      +
      +   #define ELF32_ST_VISIBILITY(o) ((o)&0x3)
      +   #define ELF64_ST_VISIBILITY(o) ((o)&0x3)
      +
      +
      +

      st_shndx
      +Every symbol table entry is defined in relation +to some section. This member holds the relevant +section header table index. +As the sh_link and sh_info interpretation +table +and the related text describe, +some section indexes indicate special meanings. +

      +If this member contains SHN_XINDEX, +then the actual section header index is too large to fit in this field. +The actual value is contained in the associated +section of type SHT_SYMTAB_SHNDX. +

      +

      +A symbol's binding determines the linkage visibility +and behavior. +


      +Figure 4-17: Symbol Binding +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameValue
      STB_LOCAL0
      STB_GLOBAL1
      STB_WEAK2
      STB_LOOS10
      STB_HIOS12
      STB_LOPROC13
      STB_HIPROC15
      +


      +
      +

      STB_LOCAL
      +Local symbols are not visible outside the object file +containing their definition. +Local symbols of the same name may exist in +multiple files without interfering with each other. +

      STB_GLOBAL
      +Global symbols are visible to all object files being combined. +One file's definition of a global symbol will satisfy +another file's undefined reference to the same global symbol. +

      STB_WEAK
      +Weak symbols resemble global symbols, but their +definitions have lower precedence. +

      STB_LOOS through STB_HIOS
      +Values in this inclusive range +are reserved for operating system-specific semantics. +

      STB_LOPROC through STB_HIPROC
      +Values in this inclusive range +are reserved for processor-specific semantics. If meanings are +specified, the processor supplement explains them. +
      +

      +Global and weak symbols differ in two major ways. +

        +

      • +When the link editor combines several relocatable object files, +it does not allow multiple definitions of STB_GLOBAL +symbols with the same name. +On the other hand, if a defined global symbol exists, +the appearance of a weak symbol with the same name +will not cause an error. +The link editor honors the global definition and ignores +the weak ones. +Similarly, if a common symbol exists +(that is, a symbol whose st_shndx +field holds SHN_COMMON), +the appearance of a weak symbol with the same name will +not cause an error. +The link editor honors the common definition and +ignores the weak ones. +

      • +When the link editor searches archive libraries [see ``Archive File'' +in Chapter 7], +it extracts archive members that contain definitions of +undefined global symbols. +The member's definition may be either a global or a weak symbol. +The link editor does not +extract archive members to resolve undefined weak symbols. +Unresolved weak symbols have a zero value. +
      + +
      +NOTE: +The behavior of weak symbols in areas not specified by this document is +implementation defined. +Weak symbols are intended primarily for use in system software. +Applications using weak symbols are unreliable +since changes in the runtime environment +might cause the execution to fail. +

      +In each symbol table, all symbols with STB_LOCAL +binding precede the weak and global symbols. +As +``Sections'', +above describes, +a symbol table section's sh_info +section header member holds the symbol table index +for the first non-local symbol. +

      +A symbol's type provides a general classification for +the associated entity. +


      +Figure 4-18: Symbol Types +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameValue
      STT_NOTYPE0
      STT_OBJECT1
      STT_FUNC2
      STT_SECTION3
      STT_FILE4
      STT_COMMON5
      STT_TLS6
      STT_LOOS10
      STT_HIOS12
      STT_LOPROC13
      STT_HIPROC15
      +


      +

      +

      +

      STT_NOTYPE
      +The symbol's type is not specified. +

      STT_OBJECT
      +The symbol is associated with a data object, +such as a variable, an array, and so on. +

      STT_FUNC
      +The symbol is associated with a function or other executable code. +

      STT_SECTION
      +The symbol is associated with a section. +Symbol table entries of this type exist primarily for relocation +and normally have STB_LOCAL binding. +

      STT_FILE
      +Conventionally, the symbol's name gives the name of +the source file associated with the object file. +A file symbol has STB_LOCAL +binding, its section index is SHN_ABS, +and it precedes the other STB_LOCAL +symbols for the file, if it is present. +

      STT_COMMON
      +The symbol labels an uninitialized common block. +See below for details. + +

      STT_TLS
      +The symbol specifies a Thread-Local Storage entity. +When defined, it gives the assigned offset for the symbol, +not the actual address. +Symbols of type STT_TLS can be referenced +by only special thread-local storage relocations +and thread-local storage relocations can only reference +symbols with type STT_TLS. +Implementation need not support thread-local storage. +

      STT_LOOS through STT_HIOS
      +Values in this inclusive range +are reserved for operating system-specific semantics. +

      STT_LOPROC through STT_HIPROC
      +Values in this inclusive range +are reserved for processor-specific semantics. +If meanings are specified, the processor supplement explains +them. +
      +

      +Function symbols (those with type +STT_FUNC) in shared object files have special significance. +When another object file references a function from +a shared object, the link editor automatically creates a procedure +linkage table entry for the referenced symbol. +Shared object symbols with types other than +STT_FUNC will not +be referenced automatically through the procedure linkage table. + +

      +Symbols with type STT_COMMON label uninitialized +common blocks. In relocatable objects, these symbols are +not allocated and must have the special section index +SHN_COMMON (see below). +In shared objects and executables these symbols must be +allocated to some section in the defining object. +

      +In relocatable objects, symbols with type STT_COMMON +are treated just as other symbols with index SHN_COMMON. +If the link-editor allocates space for the SHN_COMMON +symbol in an output section of the object it is producing, it +must preserve the type of the output symbol as STT_COMMON. +

      +When the dynamic linker encounters a reference to a symbol +that resolves to a definition of type STT_COMMON, +it may (but is not required to) change its symbol resolution +rules as follows: instead of binding the reference to +the first symbol found with the given name, the dynamic linker searches +for the first symbol with that name with type other +than STT_COMMON. If no such symbol is found, +it looks for the STT_COMMON definition of that +name that has the largest size. + +

      +A symbol's visibility, although it may be specified in a relocatable +object, defines how that symbol may be accessed once it has +become part of an executable or shared object. +


      +Figure 4-19: Symbol Visibility +

      + + + + + + + + + + + + + + + + + + + +
      NameValue
      STV_DEFAULT0
      STV_INTERNAL1
      STV_HIDDEN2
      STV_PROTECTED3
      +


      +

      +

      +

      STV_DEFAULT
      +The visibility of symbols with the STV_DEFAULT +attribute is as specified by the symbol's binding type. +That is, global and weak symbols are visible +outside of their defining component +(executable file or shared object). +Local symbols are hidden, as described below. +Global and weak symbols are also preemptable, +that is, they may by preempted by definitions of the same +name in another component. +
      +NOTE: +An implementation may restrict the set of global and weak +symbols that are externally visible. +

      +

      STV_PROTECTED
      +A symbol defined in the current component is protected +if it is visible in other components but not preemptable, +meaning that any reference to such a symbol from within the +defining component must be resolved to the definition in +that component, even if there is a definition in another +component that would preempt by the default rules. +A symbol with STB_LOCAL binding may not have +STV_PROTECTED visibility. + +If a symbol definition with STV_PROTECTED visibility +from a shared object is taken as resolving a reference +from an executable or another shared object, +the SHN_UNDEF symbol table entry created +has STV_DEFAULT visibility. +
      +NOTE: + +The presence of the STV_PROTECTED flag on a symbol +in a given load module does not affect the symbol resolution +rules for references to that symbol from outside the containing +load module. +

      +

      STV_HIDDEN
      +A symbol defined in the current component is hidden +if its name is not visible to other components. Such a symbol +is necessarily protected. This attribute may be used to +control the external interface of a component. Note that +an object named by such a symbol may still be referenced +from another component if its address is passed outside. +

      +A hidden symbol contained in a relocatable object must be +either removed or converted to STB_LOCAL binding +by the link-editor when the relocatable object is included in an +executable file or shared object. +

      STV_INTERNAL
      +The meaning of this visibility attribute may be defined by processor +supplements to further constrain hidden symbols. A processor +supplement's definition should be such that generic tools +can safely treat internal symbols as hidden. +

      +An internal symbol contained in a relocatable object must be +either removed or converted to STB_LOCAL binding +by the link-editor when the relocatable object is included in an +executable file or shared object. +

      +

      +None of the visibility attributes affects resolution of symbols +within an executable or shared object during link-editing -- such +resolution is controlled by the binding type. Once the link-editor +has chosen its resolution, these attributes impose two requirements, +both based on the fact that references in the code being linked may +have been optimized to take advantage of the attributes. +

        +
      • +First, all of the non-default visibility attributes, when applied +to a symbol reference, imply that a definition to satisfy that +reference must be provided within the current executable or +shared object. If such a symbol reference has no definition within the +component being linked, then the reference must have +STB_WEAK binding and is resolved to zero. +
      • +Second, if any reference to or definition of a name is a symbol with +a non-default visibility attribute, the visibility attribute +must be propagated to the resolving symbol in the linked object. +If different visibility attributes are specified for distinct +references to or definitions of a symbol, the most constraining +visibility attribute must be propagated to the resolving symbol +in the linked object. The attributes, ordered from least +to most constraining, are: STV_PROTECTED, +STV_HIDDEN and STV_INTERNAL. +
      +

      +If a symbol's value refers to a +specific location within a section, +its section index member, st_shndx, +holds an index into the section header table. +As the section moves during relocation, the symbol's value +changes as well, and references to the symbol +continue to ``point'' to the same location in the program. +Some special section index values give other semantics. +

      +

      SHN_ABS
      +The symbol has an absolute value that will not change +because of relocation. + +

      SHN_COMMON
      +The symbol labels a common block that has not yet been allocated. +The symbol's value gives alignment constraints, +similar to a section's +sh_addralign member. +The link editor will allocate the storage for the symbol +at an address that is a multiple of +st_value. +The symbol's size tells how many bytes are required. +Symbols with section index SHN_COMMON may +appear only in relocatable objects. +

      SHN_UNDEF
      +This section table index means the symbol is undefined. +When the link editor combines this object file with +another that defines the indicated symbol, +this file's references to the symbol will be linked +to the actual definition. +

      SHN_XINDEX
      + +This value is an escape value. +It indicates that the symbol refers to a specific location within a section, +but that the section header index for that section is too large to be +represented directly in the symbol table entry. +The actual section header index is found in the associated +SHT_SYMTAB_SHNDX section. +The entries in that section correspond one to one +with the entries in the symbol table. +Only those entries in SHT_SYMTAB_SHNDX +that correspond to symbol table entries with SHN_XINDEX +will hold valid section header indexes; +all other entries will have value 0. +
      +

      +The symbol table entry for index 0 (STN_UNDEF) +is reserved; it holds the following. +


      +Figure 4-20: Symbol Table Entry:Index 0 +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameValueNote
      st_name0No name
      st_value0Zero value
      st_size0No size
      st_info0No type, local binding
      st_other0Default visibility
      st_shndxSHN_UNDEFNo section
      +


      + +

      Symbol Values

      +Symbol table entries for different object file types have +slightly different interpretations for the st_value member. +
        +

      • +In relocatable files, st_value holds alignment constraints for a symbol +whose section index is SHN_COMMON. +

      • +In relocatable files, st_value holds +a section offset for a defined symbol. +st_value is an offset from the beginning of the section that +st_shndx identifies. +

      • +In executable and shared object files, +st_value holds a virtual address. +To make these files' symbols more useful +for the dynamic linker, the section offset (file interpretation) +gives way to a virtual address (memory interpretation) +for which the section number is irrelevant. +
      +Although the symbol table values have similar meanings +for different object files, the data allows +efficient access by the appropriate programs. +
      +Previous +Contents +Next +
      + + +© 1997, 1998, 1999, 2000, 2001 The Santa Cruz Operation, Inc. All rights reserved. + + + diff --git a/specs/sysv-abi-update.html/ch5.dynamic.html b/specs/sysv-abi-update.html/ch5.dynamic.html new file mode 100644 index 0000000..da7bfb6 --- /dev/null +++ b/specs/sysv-abi-update.html/ch5.dynamic.html @@ -0,0 +1,1250 @@ + +Dynamic Linking

      +

      Dynamic Linking

      + +

      Program Interpreter

      +An executable file that participates in +dynamic linking shall have one +PT_INTERP program header element. +During +exec(BA_OS), +the system retrieves a path name from the PT_INTERP +segment and creates the initial process image from +the interpreter file's segments. That is, +instead of using the original executable file's +segment images, the system composes a memory +image for the interpreter. +It then is the interpreter's responsibility to +receive control from the system and provide an +environment for the application program. +

      +As ``Process Initialization'' in Chapter 3 of the +processor supplement mentions, +the interpreter receives control in one of two ways. +First, it may receive a file descriptor +to read the executable file, positioned at the beginning. +It can use this file descriptor to read and/or map the executable +file's segments into memory. +Second, depending on the executable file format, the system +may load the executable file into memory instead of giving the +interpreter an open file descriptor. +With the possible exception of the file descriptor, +the interpreter's initial process state matches +what the executable file would have received. +The interpreter itself may not require a second interpreter. +An interpreter may be either a shared object +or an executable file. +

        +

      • +A shared object (the normal case) is loaded as +position-independent, with addresses that may vary +from one process to another; the system creates its segments +in the dynamic segment area used by mmap(KE_OS) and related services +[See ``Virtual Address Space'' in Chapter 3 of the processor +supplement]. +Consequently, a shared object interpreter typically will +not conflict with the original executable file's +original segment addresses. +

      • +An executable file may be loaded at fixed addresses; +if so, the system creates its segments +using the virtual addresses from the program header table. +Consequently, an executable file interpreter's +virtual addresses may collide with the +first executable file; the interpreter is responsible +for resolving conflicts. +
      + +

      Dynamic Linker

      +When building an executable file that uses dynamic linking, +the link editor adds a program header element of type +PT_INTERP to an executable file, telling the system to invoke +the dynamic linker as the program interpreter. +
      +NOTE: +The locations of the system provided dynamic +linkers are processor specific. +

      +Exec(BA_OS) +and the dynamic linker cooperate to +create the process image for the program, which entails +the following actions: +

        +

      • +Adding the executable file's memory segments to the process image; +

      • +Adding shared object memory segments to the process image; +

      • +Performing relocations for the executable file and its +shared objects; +

      • +Closing the file descriptor that was used to read the executable file, +if one was given to the dynamic linker; +

      • +Transferring control to the program, making it look as if +the program had received control directly from +exec(BA_OS). +
      +

      +The link editor also constructs various data +that assist the dynamic linker +for executable and shared object files. +As shown above in +``Program Header'', +this data resides +in loadable segments, making them available during execution. +(Once again, recall the exact segment contents are processor-specific. +See the processor supplement for complete information). +

        +

      • +A .dynamic section with type SHT_DYNAMIC +holds various data. +The structure residing at the +beginning of the section holds the addresses +of other dynamic linking information. +

      • +The .hash section with type SHT_HASH +holds a symbol hash table. +

      • +The .got and .plt sections with type +SHT_PROGBITS +hold two separate tables: +the global offset table and the procedure linkage table. +Chapter 3 discusses how programs use the global offset table +for position-independent code. +Sections below explain how the dynamic linker uses +and changes the tables to create memory images for object files. +
      +

      +Because every ABI-conforming program imports the basic system +services from a shared object library [See ``System Library'' +in Chapter 6], the dynamic linker participates in every +ABI-conforming program execution. +

      +As +`Program Loading'' explains in the processor supplement, +shared objects may occupy +virtual memory addresses that are different from the addresses recorded +in the file's program header table. +The dynamic linker relocates the memory image, updating +absolute addresses before the application gains control. +Although the absolute address values would be correct +if the library were loaded at +the addresses specified in the program header table, this normally +is not the case. +

      +If the process environment [see exec(BA_OS)] +contains a variable named LD_BIND_NOW +with a non-null value, the dynamic linker processes +all relocations before transferring control to the program. +For example, all the following environment entries +would specify this behavior. +

        +

      • +LD_BIND_NOW=1 +

      • +LD_BIND_NOW=on +

      • +LD_BIND_NOW=off +
      +Otherwise, LD_BIND_NOW either +does not occur in the environment or has a null value. +The dynamic linker is permitted to evaluate procedure linkage table +entries lazily, thus avoiding symbol resolution and relocation +overhead for functions that are not called. +See ``Procedure Linkage Table'' in this chapter of the processor +supplement for more information. + +

      Dynamic Section

      +If an object file participates in dynamic linking, +its program header table will have an element of type +PT_DYNAMIC. +This ``segment'' contains the .dynamic section. +A special symbol, _DYNAMIC, +labels the section, which contains +an array of the following structures. +


      +Figure 5-9: Dynamic Structure +

      +

      +
      +typedef struct {
      +	Elf32_Sword	d_tag;
      +   	union {
      +   		Elf32_Word	d_val;
      +   		Elf32_Addr	d_ptr;
      +	} d_un;
      +} Elf32_Dyn;
      +
      +extern Elf32_Dyn	_DYNAMIC[];
      +
      +typedef struct {
      +	Elf64_Sxword	d_tag;
      +   	union {
      +   		Elf64_Xword	d_val;
      +   		Elf64_Addr	d_ptr;
      +	} d_un;
      +} Elf64_Dyn;
      +
      +extern Elf64_Dyn	_DYNAMIC[];
      +
      +
      +
      +

      +For each object with this type, d_tag +controls the interpretation of d_un. +

      +

      d_val
      +These objects represent integer values with various +interpretations. +

      d_ptr
      +These objects represent program virtual addresses. +As mentioned previously, a file's virtual addresses +might not match the memory virtual addresses during execution. +When interpreting addresses contained in the dynamic +structure, the dynamic linker computes actual addresses, +based on the original file value and the memory base address. +For consistency, files do not +contain relocation entries to ``correct'' addresses in the dynamic +structure. +
      +

      + +To make it simpler for tools to interpret the contents of +dynamic section entries, the value of each tag, except for those in +two special compatibility ranges, +will determine the interpretation of the d_un +union. A tag whose value is an even number +indicates a dynamic section entry that uses d_ptr. +A tag whose value is an odd number indicates a dynamic section entry +that uses d_val or that uses neither d_ptr +nor d_val. Tags whose values are less +than the special value DT_ENCODING and tags +whose values fall between DT_HIOS and +DT_LOPROC do not follow these rules. +

      +The following table summarizes the tag requirements +for executable and shared object files. +If a tag is marked ``mandatory'', the dynamic linking +array for an ABI-conforming file must have an entry of that type. +Likewise, ``optional'' means an entry for the tag may appear +but is not required. +


      +Figure 5-10: Dynamic Array Tags, d_tag +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameValued_unExecutableShared Object
      DT_NULL0ignoredmandatorymandatory
      DT_NEEDED1d_valoptionaloptional
      DT_PLTRELSZ2d_valoptionaloptional
      DT_PLTGOT3d_ptroptionaloptional
      DT_HASH4d_ptrmandatorymandatory
      DT_STRTAB5d_ptrmandatorymandatory
      DT_SYMTAB6d_ptrmandatorymandatory
      DT_RELA7d_ptrmandatoryoptional
      DT_RELASZ8d_valmandatoryoptional
      DT_RELAENT9d_valmandatoryoptional
      DT_STRSZ10d_valmandatorymandatory
      DT_SYMENT11d_valmandatorymandatory
      DT_INIT12d_ptroptionaloptional
      DT_FINI13d_ptroptionaloptional
      DT_SONAME14d_valignoredoptional
      DT_RPATH*15d_valoptionalignored
      DT_SYMBOLIC*16ignoredignoredoptional
      DT_REL17d_ptrmandatoryoptional
      DT_RELSZ18d_valmandatoryoptional
      DT_RELENT19d_valmandatoryoptional
      DT_PLTREL20d_valoptionaloptional
      DT_DEBUG21d_ptroptionalignored
      DT_TEXTREL*22ignoredoptionaloptional
      DT_JMPREL23d_ptroptionaloptional
      DT_BIND_NOW*24ignoredoptionaloptional
      DT_INIT_ARRAY25d_ptroptionaloptional
      DT_FINI_ARRAY26d_ptroptionaloptional
      DT_INIT_ARRAYSZ27d_valoptionaloptional
      DT_FINI_ARRAYSZ28d_valoptionaloptional
      DT_RUNPATH29d_valoptionaloptional
      DT_FLAGS30d_valoptionaloptional
      DT_ENCODING32unspecifiedunspecifiedunspecified
      DT_PREINIT_ARRAY32d_ptroptionalignored
      DT_PREINIT_ARRAYSZ33d_valoptionalignored
      DT_LOOS0x6000000Dunspecifiedunspecifiedunspecified
      DT_HIOS0x6ffff000unspecifiedunspecifiedunspecified
      DT_LOPROC0x70000000unspecifiedunspecifiedunspecified
      DT_HIPROC0x7fffffffunspecifiedunspecifiedunspecified
      +

      +* Signifies an entry that is at level 2. +


      +
      +

      DT_NULL
      +An entry with a DT_NULL tag marks the end of the +_DYNAMIC array. +

      DT_NEEDED
      +This element holds the string table offset of a null-terminated string, +giving the name of a needed library. +The offset is an index into the table recorded in the DT_STRTAB code. +See +``Shared Object Dependencies'' +for more +information about these names. +The dynamic array may contain multiple entries with +this type. +These entries' relative order is significant, though their +relation to entries of other types is not. +

      DT_PLTRELSZ
      +This element holds the total size, in bytes, +of the relocation entries associated with the procedure linkage table. +If an entry of type DT_JMPREL is present, a +DT_PLTRELSZ must accompany it. +

      DT_PLTGOT
      +This element holds an address associated with the procedure linkage table +and/or the global offset table. +See this section in the processor supplement for details. +

      DT_HASH
      +This element holds the address of the symbol hash table, +described in +``Hash Table''. +This hash table refers to the symbol table referenced by the DT_SYMTAB +element. +

      DT_STRTAB
      +This element holds the address of the string table, +described in Chapter 4. +Symbol names, library names, and other strings reside +in this table. +

      DT_SYMTAB
      +This element holds the address of the symbol table, +described in the first part of this chapter, with Elf32_Sym +entries for the 32-bit class of files and Elf64_Sym +entries for the 64-bit class of files. +

      DT_RELA
      +This element holds the address of a relocation table, +described in Chapter 4. +Entries in the table have explicit addends, such as +Elf32_Rela for the 32-bit file class +or Elf64_Rela for the 64-bit file class. +An object file may have multiple relocation sections. +When building the relocation table for an +executable or shared object file, the link editor +catenates those sections to form a single table. +Although the sections remain independent in the object file, +the dynamic linker sees a single table. +When the dynamic linker creates the process image for +an executable file or adds a shared object to the +process image, it reads the relocation table and performs +the associated actions. +If this element is present, the dynamic structure must also have +DT_RELASZ and DT_RELAENT elements. +When relocation is ``mandatory'' for a file, either +DT_RELA or DT_REL may occur (both are permitted but not required). +

      DT_RELASZ
      +This element holds the total size, in bytes, of the +DT_RELA relocation table. +

      DT_RELAENT
      +This element holds the size, in bytes, of the +DT_RELA relocation entry. +

      DT_STRSZ
      +This element holds the size, in bytes, of the string table. +

      DT_SYMENT
      +This element holds the size, in bytes, of a symbol table entry. +

      DT_INIT
      +This element holds the address of the initialization function, +discussed in +``Initialization and Termination Functions'' +below. +

      DT_FINI
      +This element holds the address of the termination function, +discussed in +``Initialization and Termination Functions'' +below. +

      DT_SONAME
      +This element holds the string table offset of a null-terminated string, +giving the name of the shared object. +The offset is an index into the table recorded in the DT_STRTAB entry. +See +``Shared Object Dependencies'' +below for more +information about these names. + +

      DT_RPATH
      +This element holds the string table offset of a null-terminated search +library search path string discussed in +``Shared Object Dependencies''. +The offset is an index into the table recorded in the +DT_STRTAB entry. This entry is at level 2. Its +use has been superseded by DT_RUNPATH. +

      DT_SYMBOLIC
      +This element's presence in a shared object library alters +the dynamic linker's symbol resolution algorithm for +references within the library. +Instead of starting a symbol search with the +executable file, the dynamic linker starts from the +shared object itself. +If the shared object fails to supply the referenced +symbol, the dynamic linker then searches the +executable file and other shared objects as usual. +This entry is at level 2. Its use has been superseded +by the DF_SYMBOLIC flag. +

      DT_REL
      +This element is similar to DT_RELA, +except its table has implicit addends, such as +Elf32_Rel for the 32-bit file class +or Elf64_Rel for the 64-bit file class. +If this element is present, the dynamic structure must also have +DT_RELSZ and DT_RELENT elements. +

      DT_RELSZ
      +This element holds the total size, in bytes, of the +DT_REL relocation table. +

      DT_RELENT
      +This element holds the size, in bytes, of the +DT_REL relocation entry. +

      DT_PLTREL
      +This member specifies the type of relocation entry +to which the procedure linkage table refers. +The d_val member holds DT_REL or DT_RELA, +as appropriate. +All relocations in a procedure linkage table must use +the same relocation. +

      DT_DEBUG
      +This member is used for debugging. Its contents are not specified +for the ABI; programs that access this entry are not +ABI-conforming. +

      DT_TEXTREL
      +This member's absence signifies that no +relocation entry should cause a modification to a non-writable +segment, as specified by the segment permissions in the program +header table. +If this member is present, one or more relocation entries might +request modifications to a non-writable segment, and the dynamic +linker can prepare accordingly. +This entry is at level 2. Its use has been superseded +by the DF_TEXTREL flag. +

      DT_JMPREL
      +If present, this entry's d_ptr +member holds the address of relocation entries associated solely +with the procedure linkage table. +Separating these relocation entries lets the dynamic linker ignore +them during process initialization, if lazy binding is enabled. +If this entry is present, the related entries of types +DT_PLTRELSZ and DT_PLTREL +must also be present. +

      DT_BIND_NOW
      +If present in a shared object or executable, this entry +instructs the dynamic linker to process all relocations +for the object containing this entry before transferring +control to the program. +The presence of this entry takes +precedence over a directive to use lazy binding for this object when +specified through the environment or via dlopen(BA_LIB). +This entry is at level 2. Its use has been superseded +by the DF_BIND_NOW flag. +

      DT_INIT_ARRAY
      + +This element holds the address of the array of pointers to initialization +functions, +discussed in +``Initialization and Termination Functions'' +below. +

      DT_FINI_ARRAY
      +This element holds the address of the array of pointers to termination +functions, +discussed in +``Initialization and Termination Functions'' +below. +

      DT_INIT_ARRAYSZ
      +This element holds the size in bytes of the array of initialization +functions pointed to by the DT_INIT_ARRAY entry. +If an object has a DT_INIT_ARRAY entry, it must +also have a DT_INIT_ARRAYSZ entry. +

      DT_FINI_ARRAYSZ
      +This element holds the size in bytes of the array of termination +functions pointed to by the DT_FINI_ARRAY entry. +If an object has a DT_FINI_ARRAY entry, it must +also have a DT_FINI_ARRAYSZ entry. + +

      DT_RUNPATH
      +This element holds the string table offset of a null-terminated +library search path string discussed in +``Shared Object Dependencies''. +The offset is an index into the table recorded in the +DT_STRTAB entry. +

      DT_FLAGS
      +This element holds flag values specific to the object being +loaded. Each flag value will have the name DF_flag_name. +Defined values and their meanings are described below. +All other values are reserved. +

      DT_PREINIT_ARRAY
      +This element holds the address of the array of pointers to pre-initialization +functions, +discussed in +``Initialization and Termination Functions'' +below. The DT_PREINIT_ARRAY table is processed only +in an executable file; it is ignored if contained in a shared object. +

      DT_PREINIT_ARRAYSZ
      +This element holds the size in bytes of the array of pre-initialization +functions pointed to by the DT_PREINIT_ARRAY entry. +If an object has a DT_PREINIT_ARRAY entry, it must +also have a DT_PREINIT_ARRAYSZ entry. As with +DT_PREINIT_ARRAY, this entry is ignored if it appears +in a shared object. +

      DT_ENCODING
      +Values greater than or equal to DT_ENCODING +and less than DT_LOOS +follow the rules for the interpretation of the d_un union +described above. +

      DT_LOOS through DT_HIOS
      +Values in this inclusive range +are reserved for operating system-specific semantics. +All such values follow the rules for the interpretation of the +d_un union described above. +

      DT_LOPROC through DT_HIPROC
      +Values in this inclusive range +are reserved for processor-specific semantics. If meanings +are specified, the processor supplement explains them. +All such values follow the rules for the interpretation of the +d_un union described above. +
      +

      +Except for the DT_NULL element at the end of the array, +and the relative order of DT_NEEDED +elements, entries may appear in any order. +Tag values not appearing in the table are reserved. + +


      +Figure 5-11: DT_FLAGS values +

      + + + + + + + + + + + + + + + + + + + + + + + +
      NameValue
      DF_ORIGIN0x1
      DF_SYMBOLIC0x2
      DF_TEXTREL0x4
      DF_BIND_NOW0x8
      DF_STATIC_TLS0x10
      +


      +
      +

      DF_ORIGIN
      +This flag signifies that the object being loaded may make reference +to the $ORIGIN substitution string (see ``Substitution Sequences''). +The dynamic linker must determine the pathname of the object +containing this entry when the object is loaded. + +

      DF_SYMBOLIC
      +If this flag is set in a shared object library, +the dynamic linker's symbol resolution algorithm for +references within the library is changed. +Instead of starting a symbol search with the +executable file, the dynamic linker starts from the +shared object itself. +If the shared object fails to supply the referenced +symbol, the dynamic linker then searches the +executable file and other shared objects as usual. + +

      DF_TEXTREL
      +If this flag is not set, no +relocation entry should cause a modification to a non-writable +segment, as specified by the segment permissions in the program +header table. +If this flag is set, one or more relocation entries might +request modifications to a non-writable segment, and the dynamic +linker can prepare accordingly. + +

      DF_BIND_NOW
      +If set in a shared object or executable, this flag +instructs the dynamic linker to process all relocations +for the object containing this entry before transferring +control to the program. +The presence of this entry takes +precedence over a directive to use lazy binding for this object when +specified through the environment or via dlopen(BA_LIB). + +

      DF_STATIC_TLS
      +If set in a shared object or executable, +this flag instructs the dynamic linker to reject +attempts to load this file dynamically. +It indicates that the shared object or executable +contains code using a static thread-local storage scheme. +Implementations need not support any form of thread-local storage. +
      + +

      Shared Object Dependencies

      +When the link editor processes an archive library, +it extracts library members and copies them into +the output object file. +These statically linked services are available during +execution without involving the dynamic linker. +Shared objects also provide services, and +the dynamic linker must attach the proper shared object files to +the process image for execution. +

      +When the dynamic linker creates the memory segments for +an object file, the dependencies (recorded in +DT_NEEDED entries of the dynamic structure) +tell what shared objects are needed to +supply the program's services. +By repeatedly connecting referenced shared objects and +their dependencies, the dynamic linker builds a complete process image. +When resolving symbolic references, the dynamic linker +examines the symbol tables with a breadth-first search. +That is, it first looks at the symbol table of the +executable program itself, then at the symbol tables +of the DT_NEEDED entries (in order), +and then at the second level DT_NEEDED entries, and +so on. Shared object files must be readable by the process; +other permissions are not required. +


      +NOTE: +Even when a shared object is referenced multiple +times in the dependency list, the dynamic linker will +connect the object only once to the process. +

      +

      +Names in the dependency list are copies either of the +DT_SONAME strings or the path names of the shared objects used to build +the object file. +For example, if the link editor builds an executable +file using one shared object with a +DT_SONAME entry of lib1 +and another shared object library with the path name +/usr/lib/lib2, the executable file will contain +lib1 and /usr/lib/lib2 in its dependency list. +

      +If a shared object name has one or more slash (/) +characters anywhere in the name, such as /usr/lib/lib2 +or directory/file, the dynamic linker uses that string directly +as the path name. +If the name has no slashes, such as lib1, +three facilities specify shared object path searching. +

      NS8E?7*Y*HONUrF=k3Kq`_y_s`*7){< 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 MH;yWtwY*>aKjsuw`2YX_ literal 0 HcmV?d00001 diff --git a/specs/kbd/samsung.jpg b/specs/kbd/samsung.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bf2564076016cc014a19061646c9cdae04967528 GIT binary patch literal 121310 zcmbUIWmH?w8wHF8O%*9_3DyEdTAW}(enkruDNwXUinX{~pp;Uiq&USX4#nNw3xN=% zxLa@y5W<`Py|1iwKizvLE9c93GG}&X&U2o*7yJY}{nv$v#fPjDipo0GZ?&biB z01_f%Vqzi^{DFjogcSJb9uVKiA3nVQh?4xt6H0PQN-A1rIx1>L8cIrfHhM-D7BCo0 zMaRy`4&r16fkFT4gaH3jASsaS-aRr9H6=CZ|L1ns0ie7`1Rw?w5wHUYDG7)u3GR9T zU;u!C1V7sU4fy|T1cXGy_)*@w|KK4$pq2taNI*nHh#x;506sbZe;z$Ci@mPHtX)L19sG zRdr2mU427iQ&)FSZ(skw;1F^GH90js^KW)#b!~lPb8CBN_xR-W?EK;qb9MbcTm*QW z|5y8e1N;BLMTy5nh@Tc>;Qw$D5PIRiM3lrNY=WduS|wEZ`9l0eavM0n5TDLTS`&_h46_#C^ihn8-#<3Ju z5nk`Q1wpfmbPW=G%V3Pd3|QN1<3mQ)QAr1vxSrumOOty8Yt${*YogL^ABLJi zk)W#9P4m$|&&nF^0EX@9KFOYYJ-!oPkz~=`$2kdSG%>sPi?eZpQw4B6#XA5$?@;eZ z2gj3k(AjZ-d+RfMh?Q8(F1m=d^AxzHBaj2~aSW{8xL>qbgzwE>Z>n5bDs1Cbu7I9z zmpu>SkQCUemJ(~3IN~FTp7wW^O?dA8ZJjb6oDRDD;L0&Yr=vT1ka5nwt3JwfUd|2g zi6gqy(lV+BhNq|6=`&pBdCfp5ckK#!aBNo-({I3w;B=qgm&H1+P<=~Qh1ux4JyPy8=hu~Mn+q4z1}0)lA{lF-)LSdEK|HO zmEY)>#lzc~@W$>e0NJMbw`9BvB3ry}9pX&iY8~qp6~DMF9FL6OeKo^TD!mY$T9Rn0 zs(LeziYzQT?3E#k?SCzBvl(ydH!V@Wobfx}y!W=!O;c%YTBF~r7dO5GjH#L5oI(3qE_*K7Wt5fL z5!aEiQEpfPv6O9+-2?`wsaXA2uIa2d5a7J5XA?{X_}N_Yxh z3y?%khDOKj<)*>xW&_zmU;G2(zKC%V-4<`+P(a9z@~oa$&YMbPK&o2N1Xed|hos)I?D=pJ$np$vSeQAe!(!gJxgjYyA2G5B;27vXpwiR-eY3F76HW zJI~p-fhXhK?PYbdX{US07y5+n02-lSn>Hd@z5hH`t;@U@jxQ1AM&@1&+AHXq6nt8z+>!=#*%hZu;I2W!k<7^4tg;O>w{M>dE7v8 zuT1U$l3Tqi>xa;E@Fy-P1iL-Y=MKV86!yCQ7OQofD`*}JuL9p(XJX&F?R)z{5K|#u z(`2>}nHEhk(z9Yv^l#X)UQ|*RtUu=lyK@KV)xX~&0d0X?BbmByFX%6`_li>2#{r!9QrJ@h{fsWLj;Zh>2`zVyp)ku~1h zp7uec_1Rk2PtSA3bINutHpHTC?WB*>K2|_6Qau1Vf)k$1uOcE`GepF(mk&uqyW6s}c z1e~v?Uc_WPexHikX)d?dsw)Kho&TN!^E6FA_dyuhHPQc}ZF}S6So7`Hk2yu3OxJxO zNKivuE}HyVMeOBY3+aJ10#%!sFU4^D@I?k~8h!FLM1(Szw{l> zDocob+qT5#?X9*Mm&*p~rFt@1d-(zPXJ}yQ%LPC9XyXNnH1H^&MP4cJLod;WB$eBt zhC}&K<21^k4EFp-?Ng#dg4h0GDvkj=KRgCH(Iaje#oWLxaJtg$Z;u6x4js>g=on)0 z*6xR=aCach-@4*dt-tqZsCIYKoIo|UvbqK0md!5OqT74(Hl?onf0W1ynAh3~24vMQ;SnP+L_{X3Fo+c5*lK*B^s#g#U>9pAYP7*KYYA&yhAho2F(y zAhw*!3ivFTepbU68r`vQgR5mS4bFfWtyxV2oX*qqUX*iT&ls-9-31hD91t#76O5-* z4N22EEY`#sSA}3Rcwu6~&>N|w76!1mx$oD-GL@z4voeO-GsxAC|7LgN(lUoKTEq6n z=W9@h3&B?)({cVD0hG2A{M`Vzz}%a$^V9 zlPr3!(@=q%3AvXRRgEt{L^ou+_5)n)=8C6v$e_xft8o6Kr6<{zJPLrRHFQd$D^exef>wVae0N%$vW#ux6lq%j#$E+&d9$=7 zjFQkpSc<81W=afg?15@JVayLqUUG#fR2Y8d2Y?lo$bEf-$bC%+MxJq_(TWsp@fL9f zYO?Wl^o?h^%qd2i`9X9u$fzw=B-p7h`s{%H_Rn13RNvv2x}?W4^CZdVKMYzNdA7Z* zzo6+KC)0;pho10gzs5d48$V!qo?146EEZU={Qxx5P1A8dA9;BAc1$sZvTsfE6nwLP zg$nS_+lofjSU=%I2KPim8GYyH%L#pe*n21ldIT5&c|-f^d}hau>-Nm9Tc;I>leNO` zW{H4Mu4P?~d8GA4ueuhXYx;COv+Y_n@S7D_S0!8)<%w30eUZg9jwyJnjjIxpL6#e1 z>dreJRr1^cyvorgS=V|o{~eA|2v1W>x+ql6z$up=v5e#N##cYfr2*Q0^}g?k|fbe>0&v0nq+bx`i8LhIXw6?vL5ak_!K$IPmICBRW{$RpxB0v8U%QG~!kCc;b z(Lq7eAa_PgPan2`uecPW^xb zz$Gj44$$@LBRMvJ3vKcu{dwju%GL;2D2F-&ptj=t${akJKI59x0`Jl1Wv@2rTV_t+ zVxWQP9Ve#xJ#xwQq}>1zWXpYx^6J<^n|(Bz3}e^3F0;#c+YF9f6+V}OrAxJ~3`Cz{ zVh3Dbd;o0}wI9V9!Vp;S<&nX?sjpuQ$ON%mqC~S4FNXp!*C^l!>R4Me)hZ^_sKh6XXD6(u4t9ETA8}(5vTCd#e9_Q;n2mEWGrFiE z7@K&Y22||NlQo#nFeTTMeO7~Ci#d0IwxZHiKRNPiHQ3VI4Zk!GVx9ZO4SB_&!U934A1;R_^G$q7FJD zlN=wqi5NILUiCA}wAH%VO$COR`VVs6{OA9;BoT`^!Iq3*f8E=Hqt!V2b?iTH(#mjR zQc$qrE`rQMUE^L_OPm=M?z$W@6M{=Sty6s!t%#5%~avN z&Z>;%W*VHa{ZFh1%>2%?mm03L7hzq>L^hYZP)QZ6w$nqtB6lL5wGhP4h|kmG5?pdu>m_<%DdmWEy}zMp&1 zIC8pFDR^z%|%7GAYIfy%*Wp7HAj_A(O^D7yosKih)#Xw^bExXRTMEFO0Zh-3sA5JW@M zA-c!cZ*zle@IyUE1yj3ILs%={zUPXv6oHd=+}lcN5R#12Wd`AD8k61GPxQ*c2|^Mb zj>;URh68{TK(R2yO9Cq3ottXm`P7F-d3Z!&)Np;m&OY|xcNxD2=9;!24vnszzIn9D zg*X*xRGbNjg`AB(kNup6kJboaHGc1C`!Kpc*ps~1 z2e?jI6=l(SgEIG+?5^0$S|;zt+9$JIqizsNvU;EGGq_NPuEcFRHorao7}#-IjPCVh zs6z5~26B$}6(U|4+Udr`o#plGhR9#*tfg%x8)`!G(>w|S8S-Ne6&ilAopI!WU*x?r z{Jg#jF%-|H(L3jmk(%Uk5&dwi5>x5KZ#BR{CPb=iUWnGN^Bq^w5_!-C9))+sMNNc> zIMNaz)LaFOnUQ`L8SO71n_od+t5viKi^?@Io`>Y$N)=w}`^-t(aJa0tlssK})+*KU z1USwg_{m2%?erWvRV>*XVyfx3`f1UzjVd!y5If?U8IE3T0)H0@m)3R;!M!8VJ#Z#J z?{!;tzn-EtXo!ewW|q8#8bP>fUwlA_q(A?`$1{+HPh(Sg%xTB+cL3?JATsjzwzI9h zJm*<9wM6wU&B_IVHPpab=pz_e&DQ|8SLbxxU6FE8;8In%4hbvu0dvl4MTy5M7F(sN z(fuM>zT=zB=>sh-x+@FJ!C|sFQ<;M@-nkI22uR4!!xqTO53YCB?_#g5`8xq*Y^U9ZQloUL)7v-jF?DSxOZXw3GDk)tFnZcs83Lh6e!K;-?hO@ZgvJ! ztB#6`k$bq!GY?@f`4~?Gx38eoI+`x>XFXCdZSlRxxi1*fG$m$6e+NJ)$jCsUYR;;= z7t~2SeRi_IW0`G(Fa^}pM|oX;xDtpsZv{u3c9zJbRlPnYY0u3S3mrU|_z={OY(>0j zngd?EN==}X*6eT{M8Wf2`r90&dag^`!hUOb2$Mup5BBTs$=n2rQk4*w{Z?x{-3qUn zTOhO!dGq6mGI5r{;}~?meV54!&$$T*7M22^*oJ<8Bt}P=yPE%lc_fQ8_4YKkfq*xt%bj< z@-x5Tm=F&GCUAcEd|G(n5}=q4Qc5}vIsM}bchOb$vG2c}`tvoq@ZT*tX1WCYZ4rc6 zY9qommEQrVR00{jVQE^0WYDc**s-YWkWBwRI9ofyo1&c8eqWPCmL9}O4xkl(VN zpCg5TTzj1l&SPI2LpwsvYoBydNZ<1t0!_IC7&%~Qd*!XaO|4(6fTVG(^(RFa4h^@z zZ6c-X{TdBtY;GEI={O`}7vf>nBYqYb2bB=gt*)D^n{gE@aQ4DgVJZK!>5d9$oZCwJ zvw#JQrtt1SVxb1?_Qn@X`6a9qEMya+{PfS)$17wmr%@L9v>>PJ(pWzZQrz3KH%FOW z3;+GVvD}b3!(4cN0kI?l5_f=LJ^rK2&LnS1znKy;IlplJxl_yfI{@f6s_ifC{0>0u zKU{R0cJY*KI;se~NH1!-r#Ibh;w`RH(ct%jO%xcl&-P3p2RF-00}U4CFAw6g$sGOG zJrwjv$c2^poX;R4x23bje@!N%``emKc%fBI(gzQv=Td9%(YA`pql2(KtA3|X<@3J@ zVN~zhWLqlC@9idjV$*fAKQ6A^7?l8kT6u~ljO_UtP9G=ym>k9(+-Fc;WFrUtD^+p# zxgY1p|DOj~J zm4i6F`NXMbFG^%T#cAD$_-$#^RqH6`?|K1gn@soGLO;*LH_TsmuPg{nPT9?JrACQ) zRbYL|NAns{?!(lhZxy08X0u0A=F6NoHgBAO-c>snidpuWT29sVYB5-t>yq zyf6K#jUL)UF41r_+UP)~Di-I)$UQ9l3;@cVV(I-W_$2?8g(NZLR++}Hr_M~IA-=8F zu2_u#F~VR4oO2rDO?x>&U-Ag7xtf~CKU*U2wl*#L&zpDUAiGR0Zc+JZdZMdglqxGesd`>#b}*`&Doxh& zV8xE&aZe`|hnWO2i2~1q`;!-bg15G1M*PSc^SsTwoA~O5?8Kh`%=Y{kCAjQ4>LUYv zzA(Wja!6*UPST>?Nv#_C<|VZk^w#&-{JSg{jK=;B@UPDG^F-F?ziXKy(RTp(xzn>e zI-U_F;=IYUXF1MJFA5q3a|1s`by9rLqe>&#megha@-CI~zXRAm9fzukGv3F)6`9og zRGc;ijVWedF~XmV{D-4`+rMQt!dE(M6#Fs(wjtpy4J}e55d35BOKYFzZH67t&UhJ^ z-<((H>iR~2RMVGIxBpYIoXtmowUz>Jtu>0hPRJv7REV5(bSZEH*fu}e&_bKp>pg${ z)RV~e`xA1B)s(}NEr8$D@IwWtHN~#RIV9By_%1)2*mYreUBwv#V7@U>r|VvzQCSe3 z3owOsRiCGp3*5V)-1I31oO4dAJ}aemtfV7-O){6ETAnfTB=4Q8ZHnafqBd$YwKL^O z)a|cPXV_F`Uz#*HTR`2oy<7<7;08-|EbtU+4cJZ0`?F(YMCIr6h)>D0+JEGXD9+5O zF3HVICoO||?90zO-t-W#;N>3}e^@?y&?mKQ6U1Hhq)dm(y>uPa#VHn zB}lPSd1VmycF=wnS6^2DZ{ugYWsDQyd$5)cjOwkX2NPrXS9#0W9^@zH^^_g=C7=VH zw~zwArOfLB;K?0;*+9{5c^}m4zpsh@J2&n3S!<})Gh%W^04`fsld>t#((**@4zTba zKfH{$a2$KT(3Hk++Su?q<}wuvL>t%3K0m_6(Z%J>{aGhZdf$Z$fTp_{wMU7juIfWx z{jvGods%s2IeBgG*(oSHQatJRgASX)#)JJA{?!w5A z%LIp|=sZ7KPKFPPbU|_txef&j^NRQWQ-2rAlt?j%y+efBHZ=K|_9%;yg zIRH;`_h+NeK&_CR0eX<1j%QwOzwTlXSxv}}I$|nnypcnTrBEdIy+_uKZi8XPk8TxZ z`QV5$U$@2lpP$328aJ~YYX)Zk)bluZT&9sDRFe3auo{mbLZso=mVSL%2SPj^t0^_% zmYGNXX2#WO+UKZh7g{r7$*mj9DYx)_4H`z%RW3g>xxn!z={1U@ zovR zhK#t>ERW;}Sot4&IPtga6Ax*Rtppby1yq}59usxl0qlO1e~zPiAp!1_;T>Umu2#{> zOt~aFeZPqJ*N_-vPKL`Fbu#BMo;T+KS%f3r1T=yY{@WJu+susiLy~Da2i89GS%a>; z>Xk6P<#hT0m0l8Z*#?s^NckXqOD&a>qQhA*?fNvldIOg}Cl!z}vfoIXx9dw9NBlXgO zJe^gg69V+cH#RNQ8WdjZoCy*&h+UmfRXhPNsSu!}sRRAs%e-wE$1g8P?3P_pt+lPB?Xm45G{COAfPrSsFRGrtb@yqSrB`K;g( z(c;gHf?8<#$e3j-+m4GOg*W#3MO=ybjxK}9&A-p;%nc^gPQ@`bIQBwe>kz>~k)YG5 zNK<>Nb&dMuInZm}&Ls8>V*%GwVKdL}xAe`(kV#}2 zjzoQO(u{Yl;KuWI??Ix72EH`j#(@Wt!7+2OZXK7!t^>hCajUT@X6Z5=n7di;u$Xs_2n_NE_c%-5uuDpG7>p{@bB{}B}Xd5ifDz;I|d_<1$p zO(94rfeDthdr_X^s&M0N=5EU(pfC4 z)M1IjTTvlskR)twT|Tj4l9^9&`jXoPe)+F0K5wWE0yCe^vK!kxb9(5VWd1A3|A5;6 zcxNXllf((ow{_lK=AXfM9|vo}T|J3`apGXvIXoWlgc7&*i* zIGoVe2U7N*v4qDmwei;*CH)Uur~fT3{nZ$KY0aeVYjtRHq(zkHOIonXZ($huZ+rSu zf`KVsiTw6LInUdvi=1v2^TNCVHEW!l8%sc~Yg`6`rgE-RbW0GyeJ>a2)?^b3i~HS* z?2Nu?zV?l}XM$(U$$Xh{I%&T%TVeQXKh3e>=QI_V(^_sja4_{>~VNIZZ(x^_H zBrRm}$D#c-AV!4;8%~WXy3NFJygqG(t|G$dXx*MpWpL1+Sl4rNT+B8SHknHGnK7Zh z)6V9l{kR=x1)iXFyhAz@8Bv^Ob8`#Pqq`5`IpoQK9$SoefX?)uwj`eo@~aKWB=Z|| z`L^AS>}S2Uqbfg8#j}Y6Nokv78vPrE@miWYfND)$n(shxd%CxEe^858F7rPIQ~BlD zh5f^Ae2ww^6TZ8i$B%*oZVQ;zC-dqS0f-`cyn3$_>b+lRcCyal z$uCQ7;2zVyz>_yHp@OrV*~xz;aI-BUpCgz-Lx}<+=Jl9_wXb)HFBT7#K2Or^% zUqdfGF`oBgB6F2;_UkS$6r&yaIq_m+fF(`fa37AgmF>gio+sOBH&-QuKJHR!WgXEezsuXc}cGJ+hNNc{yi#I8VphF*3DJ@?TGfzb9 z>?4NZU7<#CWS;)XN|G^$BdqJkSoH2r&B$|C={axnF`;ib4^7y8jH7na#3yo=W%Hwg z5%p#;d4-c=Q=8E1(wQD|S$28YQ~OWy&kjXcf@d;@w%%lwz3GQ6+H z;cC|+cp6Y{zBl(?@^%d;Dgq{xewK!hoQa#}Bf$CKqr20t>ghp?XXBJV_stA50P88& z-^htEM(ofrk={N@;}AI3vv%*S{PDkhTKy=pG2_Bpb@B~m(WfX)uWcV#r&I~%?3V}{ z?eP84laFj7*7udxEm^H>Jj^g5E0n9B)kY-_XlGR}XU)l+2gv+2b< zF{6KC>Qj&^r43KSmPwd=#oeZ=MYU)&R`~TFYfkwMl(8@_JkGKdcI=#O_5pj%rSmP9XlpZ{IBlA~2U#PSlAA6Bdtl2#nHyalOsH6zN+VBnpI-iB&at?`bd zMMa~mLn0s~IMc1yyz0oa8bYd~PXb+p?C;}5SEu_Y(^9^D-}^ydI;4Z14HsBwsW0a*?i1KUFyhFx<>J?4^rONWBRgXi8Vg zTQgN!PN-GcpGH0IYaAXfNo{--UAy&;#&jbGkV^zY56M7ov;2pU)IS0 zmJ<2~%N(opFf%_8K9s+Hph42zE)qr^0Lh`=V}JKuC@o;T_Z4bPlQh6q8|S9?s^i+T zz><1=;%ZEjXI{=*wkA!7IanU88oheP!c8<4(obC|nW;v=w*JT?%T0bYEoU0;`_=w} zZzpls3r5l`)|)8z74O@i`T~1?4x{xBTzWU*MtE;MDiBR{0N2X%#+@+Ja8kJa^r6`? zBRE#ccsg;Ib|2;c2NnhUVaH=8ov$i#;4?W{GnGW{J^8{n@oa8K%FR!a=NW z^>L9ia0u7d*HV0qTpiumKVTPZIw!6EIPS&DBKg2f$|K9Bk~$=K5G~ic3mMD-)p#tY zm=LGbry#Z(9#Jt{1^5682}l*wSq#`*m%J0SD((g=LR?BB|>Cm5riX!*LR6p1B=l1dbI43@Knq3J?*O!{iF18)fLQi)$|FfJ z(xuJ(CcK0`TcujCV5iyb|Kw16z62k(ZQL%Xemwl2-JcJWYzjs*F>FK_CM+5GsvTmr zAv;GJCLQ%2=?Ij$%1R63Y1o=g72`a;xBNRrW3J*JgoP*h@;ZW^?7oPJfW%9BgltW7 zg}gQTHT}NaAgE=G4s`FVfH$UNl-wxtS(M8N;5CxAe@GK3t>YwH5S?6jbsga>9qno> z?+JDO6vhl{u@TMwP_oz=9xAnfa*tR!ZiQ@>z=;vz(|E!Nln_JxH7lXt8hMP|N$W6&HGaoiZ9R zr&Vdzb3<0EfbQ|!;i;{DCs4plUmE8}e))X`w)~%7LMpOfk6N`J050-MYsZ?|bDK6xiYpjDM#02HwHAtx_X0XQ=euX>WJqHPNfN-A@GKc|-^V?td zwtT7U_%$FC&hQ>e!Mn8p>jyoZ^5RP>bs%~o-RxG+F_uwq+UsU!ILNtv&Usm2H@xZz zu5R3EW5YBTnhWR0*^l#r&*R=_4!B&!nb78y?56x#bjxQ}@RFs7wsCB%XM&9d`J%~DU``%A+)kkZ;0(0?E(k2&QCig$w`88QH$~38H5^_R z0HR;p=B!%+wz3NxI|tB&atlf^ZUg`YF(Z;;1j3k*0RxfqRdm9Ja}Tf92M%E2Wyx)2R16H`j$a ziCBD@lQ^>@WjAZ0j2`wIU4E8A5L(K7i z7Pt=??h?M5`d4%O$dbp!(&gMn@#;NZfzR5LPMEEdj`&zo64 z2&A3a_>q-3-ufXSp1i9_yt|yTOTOw@2CG=%5GH}GG&X=z?eRT5sg+_;7}8QLjo8{j zV|2=UVUO1~Q{>S%VRwKBPqoVH!j1|re&Vz`Lz5Gmym~^3 zHHx=24%gLSF-GHG`un!RJxp0)&DLzUuWJ*yddta_y#2z^$c5$r`?Mu`5xmvMz}kYa;mn;Rr8&M@!q9U$JnG$U)4NGS++ERzGi zoNcbcQ{r^_xicMMbTrA^yw;>;vTd|9G;d}`^lzeIlfq%lrrL?{dxD1QSfBoKwZF~N zmi5OhL%%inV&pjH7@x?xHGJ_UqtTN2Vdvd#Tz#||$&VWO5ppl2q~02|bq6RnqoRxO z$cwe(NT(j*#naDbVBCR{F97<0W`=wIyri81EtIIv!ejX%CN*3Ej`i|7`vciHwnnX+ zm>TiD7ToCksU`ETy{kcSb;LdDwiIuib8lafKlb{L_k6>9fsK?eFuKvv7rY7SrlXPN zrUS@_B@XYqZLic57vy z5-tidVBbZ8hiNvecAMf0w%Qt;Zfxa>W3~7~E@P#l@LRwiL&M9Go_osgB^)4BGPRBZ zvLCyN2uVmY0Z!MEchZX5Cp`x-=*s|7J0C~9?agXttLk6u(2)$L|+?)r&p zfhF;^jwP^sO)u7%?60G905=glk4O4^GmbdLqKaZ&dj}!XF313|h-;VL3=R)c&g0(c z1qVTY5W8f=V?#fXPelku*Zk^dc2QgAMo-0+pXE8a`aXEA?P4hWMR0_5H=szqUm8zv z0ZQ~DI>)1K7@ffQu|Lmz4kNf_&)WX=5;DTlL8yjpw-M%Gx%(3ZYWJ4iGL2*;@^<7z z9{KscA*BP=gr&TbkT@%Djp`d$eMJkn%p#hY3KCY6*i7gHma1gBGr~dV+|rgJsZ|0} z!A{!9s1;#l?Fi+YPT`62sn9HSQv!lH9c7LjQU&e!bqXKqc`w--ua3M;b48>y`5H+= z?68h=)ft(u_#MEk$(+jDwco6I5%A9CL^4_#zr)_5m9~{l+6*JcOc`^j%V_*t8Ku?n z0R@fyopqUH#=k4EXnXmLsc-*8sQ0=$sU<3c_OqG?XYfMwv_6J&!nuge^x|ZjuY>6ubFE1souJ8R};f=Hcxj z#hJoD@Cf>%)SF_B1Ma(c^sQashc{88*g>E(q`%c#CsVAjaHzk=zR8^~5yAYO<(&%a zWjW1pV92w`z_;>Z2W|{9ttE3JCEMknk^gykyoUfwExeCKJgQ&X#}W&bt-rz-$TuBi znY!BQsVU!|vRcI#$u#c=BPCGb^ZD{zkiNJ^Gwb#>N_4MP% zE2PpH#5wh=64!<0ddEv)tH)$v{0$wh;{W0I&OVIY0Wyt#`5OqE?fvl<|0>$(4=taw zm#Yj9R7H6RX0(4tWBjJaBQIpUl)$?OY$>vS-*lic<-bH9N~J#h$1kvAYZD$(m9exc zgRa56TeHm4Y%t{Ue;9>w2Y395k%obiV zpLO4GP4OBY!4C6BVQfZz;;1mrrVQ2e0Gjk1RxHH*LBpZ)eWobA@F% z*HgLwxt7+>*3icNisNTLt(x0w?fMP(+XHVUMKayp_lzn%+Ud4a`1p|OP7d{$JZA*P z=K4WzL+L`Vg~-u*yQAF78ZGrsv#LUo*C%)v!Kep<-aE|bqj9PH>enqn`4gh^0~nQhik3V zS+>D3W#joow|Y=19IHFl#msmW8p+suWqa1_QT=`0DQ?qM#$_z9b}RXT>I2EGXGsuN z&&z_nX#-ajolbxn?nWnVq;PS>^;SM+uz$=Q9I8Li2Ovz-f=J|YZgJ7r8CxJLY(nOB z9(i`=#7(qvuhol?tp=J*sCIzjb27TAsbbP=NLQ`iAK9*D?WhP&r1`!H@uJ7tMVf^~ zd#dT>^NZM{YkN=9vd?dqm?3&tR6`bjfOtpxC_!_JEc z2?K0tLhq+hYFM+{w8}`(Zw7U@5^-=uz4s_>CGR!DMb>^gXLzlctCJ}RxBw<#@BL{h zFl$47Wn+%Ew~CwB;A-4W0rp-|@cGtdtWBvfzr=gPHSb|ZynMlMf0+`%&&4h)XvZCZ z7pF|x=5&GzB0yy2o?N;ld^js~zYz+^)C(|>Hu{)Nm&EsGn90Kc5Q1Uc^nicMphdY3 zTJbM5@;mlIncZ)ByWJQ3OeXFb^K0%(pl-Wv;&4}=B6daEBYbbm#ywbChk^$?m7sqE z6SUI}_p~^aa3x2dNV&8oO=W0pyKy<-sYdits4Q1K;^(IW8L=UGX!2^)h}7zB+-Kuq z-tWq{|+u$|vRFhLCioNZVOoF%ivOd#^m?ui)rkxJM#ilftv z&jK)Z5WFXZe+SKPq5VgTumqC_FBcGgK8zD}h0!JT&WtDw?T58Y?!7H*Ba5v@R>xm;o@YxG;l9btbhK|iu z-8S=%Gjq&6>Lof%v(nN2FQFlE&=by1uWNENvZWf&>O4mN6Y=#|{lI|ZJN${WBszf_ zEgyVL*<9IbNPM^HcB;xjYl%sL`}%!>>)U%*_lV=3qJB)S@IJ9pe314PjJi%4;B!`z zL^5wpfKXZKtwAOH&w|>>edYRPdWmFOxe?N2@eALcX+j35i9%xJ4>X8^5zrqpJ=~uz z`^#RjaTG|82S<5q#^K9d{fFO__H4jExO4}xwmXXN$5AARd^-X}9v1_Pi}Elc?`1Qg z{3tgN2%m~4$bhNYfzw%0kgR$O+cjWi{xYa5y^N?j+S!iGhox}8Gj}aQPCyPpM4g5c zp&7^_D&q;F>gPhM&S*#by-}79)ce{kvHSoy6*3#rZ+1q~ot^W=4sxx1rCU)31hzh< zUr&)_q)09(5DB{0UW&N4wW9(+x~Y$d=eX4?O|!<&eAzO%OxZqO_J7LjLuIFE8GBN*llsOQ_u8~sD-yyc!O%i8of3Ym51^b z&xjUN2#Dx6(*k{jgll~t=oHZJCiXq0M?d2e-A?TkD<$Yk&f{1XzJu{PU~aUWNE1_~{jLC+c? zh{7I0n61DHyd!w>{@)I=Eyo(fkGSqJUzW|8O`MAsxMt=-BdBe-mXNs*W5)a@JORED zBG&)DFXjhFd5NqBfi&3O0KuU$gnwT<3)#|3XP}B(Y)Yl~*Ss*08t6yt5lUhBu+F0%CYthNz_Kz8`g?)7Sp9NFWh?9*C9^N5JLkcVB z>{QtmI@}fgpZ7To{b;Q>gj)<)2P2wv+Ig>!Z*6bX-P{@Hk{vBnFGV_|jsk0NcwsbK zVT}auqlo)h%*I6RVP)|rmqMAC!kcxv1uJlz#<=mlvh}Ax_Py?+wZH!dN7o(B=KH;4 zR8-BDHb~I&F*_()D^_cd*jf}7tvzCk5u>Px*hLzlB}VOXg{^qI)S1=sBF<;j=T&d&*=70(g9O;IZ1g8$Xr)FEjG-G~egED3t~ zxFNaaXKeUVIJJ_U+2`wSY3Lx_8En>YX`Nko;6*m^wp?Mm)i}U$cB?)E_w3ekd6L~- z{U-i*{aQ=m8J)IAz^*2PuLEvwf=%GEvDDCx-_>U&O@Tipy%Ua}uJZ|Oy^N_8b9-y% zVqNgT`yU{SvRiS@@<^`tPwk9BIw~OOFg%~XXG}Pg?8W2!#6Yv#g={M=bBFgLsQv5< z&#KH943F_wSIOx~Ie`a9J1YAB0J@wXwEQG=ML1Af9bMP|G&h!e0+iCzF&Fk0?u1L* z4)rS4BJO;{ny3TUgDL*kvz(sG z{N}-RDo9~kjWT^oXRs|x&cubdJ)5z1)Bc@330!jRwB`QD^4WBZn1$7irE)*ObjL&D zH7mn{mY;9ix!LkoDSFu7)p~>w6{122mVoe=AHJ2ZjH5Mj(o?!t+8*bobfW;SYrwB3 zMqV{jH$2y*_$ipQV>Ib!xTtdz^D9yq{DlIR2{00->C<+KvAB;%enxk9=gz}8ToJtS zkBHUWE&z_sFHdb^${Ej~^L_WOx+?V5ek|dA)5kJGWlOl51Lw3)#xX%@WT(jjr@E+} z6WfG4oo}_qMedwf(o}@1Z!4FyXe?N122Ih*N}&Ts+)rjkzLQ znEL_*xS(!BvW?29SSK|>Y=ez84|Lms9h!V@H8%e&Fn)Dh-`N`B6rnN$s=VBos+Wx! zH`P-r_(QO`jgrTYxfM(Kb^0h^-vvI|~#=8h%A-N{NER~q(gTSTb#`%lgE;vh6Dpi?}appZW7k@HR$|;Ta+E1x#Tz`}x#EV1>M5#x1{kG6*6QT3oyl zBrl{Io=@x3Q;ap4+Z%U{-X%u=`S)E7A8bmzIBX8$DLZx(J&6b$;oJ$? zqfKkj1-h}&6(Jdm5cm|GZiO&Wu2}L|)FnB8s+Qt1h}1$`H9!QBxd+IGq#{nlxcp(B z1@CM+o3S3w##hz4iX_4tyns^}4B1uPFRjk`nkJKv6J^f}kQo{0ejl{z8iVOn;)DH2ENgC9?^KDVd!05X0V8f6AE}KumJnF%&ydSG1>c!9U0SnP1 zxnJMr>IQ<@R*gKf=(<(P6@}PcZpaT%RQqlgJ)dC+`u46S$<9huj~lzF|VYkZd4-Sx!mzw$&uiT5;7-XXg> zSVX^Ac>YcSc(30z4)GoD?W;r3k#VFO9LAjZ&PKGf;SY$WDI++2zrK6&tBVL06sT5WywWEg*qq>>0>kUr)K1W*P|79G7+cuce)ECOv% z%`g{FUMU)(y@kvPEYw+0q+D1>32$20DMvSjQrxv9j5Ce!_T4AG z7&Wl-oswZou<~ouDp9+W4}Zh25O!bwT%u;U**tH>nWb*Oxd_75?)AMq^eZoII{P%? zea)Zx9~lPHs~o~P0!l?+bm32yO~5k7{6{RIEiNBiElLwSba&Vl=yM{@S#0CF_--X^ zxIKJw=sj_^Yla_E?%GpM!t=&J)?d`TIb6^-HRBIH9Ny;A^>8Q#*+N}lc#WSerrvLssmIoTT_7`zhy2R}t zhV<{mwZ2y)^SgMf++HZr&%6d6Q0#>TgR0M+n@^((28!+}dF4Gx6=|({opii>pBm_& zP(?>KYI*%`-O(ug2XJ7_y2$f5ccc8SDVDnmU+xl(p<}p{qLdByqaeCqQ~$Wiuu6#Qc&PmXkGjfq3g)cd{gtDrjK0^y6O>^y3i2*{pA?hEx4g z!%;!Yxd_b-)kUNclwM$;Oc<4Hr&IFpA-1(c#6J734(L7{biaJ;EXRLW`nL=MLpM^+ zt9qDcg+~0nuV})j1!j7HWtG;eJ$yIeO4dUzB*W#v@G(L#q)}#M5KX^{C<}qF>auaK zZ_Z|VaZ}HkB&!-}EbCb{>w_q{J^>LB7#A>o56Rd@k%=pw-rau}za~1zO0$q0IU>aK z-g=GMhlVrm-GCj^hBi!8fKQDx@^zzNp^Hy=uCBiQexDd6cUfDOL9SiJO8tK*Yc&2M z-F^;Rdui&L5?m!w7-o|i_ID$M2Pjhfq59!90aT)xpr@f2 zI~8?w2Bcxo>P2)*{5doMcU9>khm&`Z2vx|bNsLIL!SyQFHjmX&qo+aK=PumZLPo)x z!^t+LsfJ>oPIy!LTEK0DyDOf4ANR zKtxWpNLaKJ9tH`ZqTxkJZGUIXZN z2~=)8Cw!Zz6u7!+IRBgxM8A-RT?`XLq>W*GNiZaU_Y>#PSSApRgIV2{NccULR-~ro z**r{#$BHpa!iw`kjL~d{&J)S)XD-l>qJTj)AUbfkjW@(;i%3FVUV3{pR4l=yK_|n9 z^v_p9s4}|f=341HWS;HkS-;jA#v@Vt%U`VIL7a+_{73*4ISBlteo^=CwJ&}zDt z)CCftw9wcu;+ZeZW#H6HbdY9r6^DD)zIqk-YSE%v03 zw8Y36X}U980^W(=#I+H?ie%CtPahHi)Q2wAAU9k%le6fk8z44^m`rBIqB2COZLTOX zHf|^Ho<3T>U;1cxf3=UMF*hO)z@~ed?>&Y!0)x8>>68;J6jS{xpC5f>5+$YjiV~>n zvte=RvIS6FZINSe*dz)nt(p{kzJT^r#Dn&oO__cR zP3&J>J0tyh^81Qxbm399$4oWL+=QAO4QYmo0m-iMiH_v|+>>9&JL+%)PQczMI<#rR zuy$Wa1*u<&GBt_S*(<472nmV5nIR?QZXWlJ;XMg*Nk!V)kE2EpZ%>!o9R&chI@3We z0YpLxwHq*~i}t|+PC6BlM5LQACE3>I6TuV&d5hRSw~%&)QB5fzKNW!$Qxk-C-TMz2 zCKko+GdjZ= zOx8qBMqVE*tFBG_>{dYA5J?&T_r< znsPFHox5K}Tx#019)WRE+SR_@v)gaz9bzOEIcgReB(g_*OcCP1-36CD?*@wSbtn61 zaS3RgP{V*xmfUuEq>6+?$C)-+Ybkq;`te!{K|_KWyDtEQ?5Y>)yo-AF`t<@f!Ux5a zE@+?H947YIkq)bzZWG|BL>5#sK5T@XuNV}-Tf<72B)d@xv_D>BV}kP{7*OT9Mq7$Z zns)A|MiZhbmq05TH+gH&Z$axLC~7SfDZL zt<9Oo*ZGpruE#+b%>uP|YX~b+%>gK!)9gV5^DyNC$KmLy;oQ8k*kq}Z?XHK|=yJW> zM_o6UlM#J4Cz1f*9p59R{S=SrpPNnW&&V$2jseMy=Y>SlPNebFfA#E?;$DNwnrA2#pq7#E_(t=~B>=P1YV^LC zk%?;r7EvIci9Y!UGoO_14Xh?3v3)txa1!=hKY$UZz4%n{zh|KPDHB+YFvz^#=+9;q zuK)!dc6X;w;EPX{_y~cWJfvk+DBEagpLob+kY|*M)@gaqd7!z~wsXH*Nmr=Jh(=s| zL5k^OBQI(E-9LcxelHE-)35blny58+_cQ+Bve4Y1**fIht)~76PIif)dz1n^ z_3flG-7hjqytcf$ec+)Fr0C91Q&D?dG8dKi!wM7$el#M0Ypc36%NWbjsZi$a+pmI~ zu(_ZOu4e-~TtyyRtXsQ?O3l{K9)>CwMQi*PG3)Q9x1WDI7X^n{wpyRjeFX3(2COHY zOUK_hjxE>oiVWwq2_A1sC(WAif4g)Ke!d8+k5cxYRP7Hg04(}*?X!GoM_uY}&RDt?`rnq!lkRw4_-X(8S)Z&f^oi1Aw)C&~Ew*{>)#!c(s6kkm$JSii~K8oPC#L zg^}*@Z&i{j>)sEqIUK`3MgmVo8N~hT~C;-OW~RM>;EmE(GiL&4j7(LmiO zNtG6#+!0yNdr`{rK36mfNf-M=%fF8#R$!tB&=!;e^BoeW7613+)NN_ymq~M47`uSe z9AW9H!wSUenXCg_gst!e6s`-i0m|+rM+@+e5d>B-l-;5Y>XzIXdl|aTwsu~|PLI1F ze9?}lih5%Vb8BX1QNast#%p(|JhES_fB8kyy0u#5J=*D$eQ~EX` zDfi3g8rr!vOA$qs?FWV7Dcvdux(D-~G>hBox&nanAwq2K!_?Ch<=L=->oDpAJ01a! zk}S`z-uwsnXgbiwf5j;WWwkt^LArQU`SSYA3A1VH1fHOl|Mpv0Pxx$+Z#S$> z&r8aj1e4+a01M&iMRO|AsJ~+6Y~H3SCoCZxb=>q$lSv;>qmQ?>{(l`ZXMmTwj%{uh zc2Hk8&>RLlV@NtOYGo(!bk~hkCsE&C>3AwCPqJe9fNd#WLJg}Q>?;x^e*>Ctg>QT= zuRyJ4@*n+?YNZLXaZE%#1u3VXwz<}C4Wa@^;henBF&<~mOW}4tY+k0H7Q9YXj@%HW zcz>!#i#rtnT@V*MRsJiuag=LfqV?!17)5^H@_DVzkNZsQ>jcLLaAJ6A$IgepzU23g zlGGQc8PMWAwCB;qK9%RID$a0DC_@${*j-$5xuCafKF{!xlwQXv_cnrQoxh}>Mo*1y z1Tp8+y*-__ywQJ~; zK8?}iVc0K9TN2p6JXANMO%o`2Jtb}F|zK8CXgA0Fnz{;2Ka zat5*;kLVT_`}?%Ceb)t(&fk3awk1f?ON`b@BS`sls2u$X(^w3lh_pcMxk)PXTA!zO z`Kd=YSEQZowf1G67p0NoFDCy1jKmB60f4PHwZ=QJ7t4st7oHNUF_B3kf-=E(W_o(^ z-#{WA3Y!GU2}!ZaN(qW*QX!-lQVlzBv!$(v7(o@4SXtww6My(wOjx0XTK6Hz9jAG9 zeKofnT(y3bv<}to;GK>AwNQ z-*-A53nRsZKJ-x;4uux#s!Y}XG^k{*w<=%n0dyJ@FHtw!=P7W<6^aSDxOCeLmU<%EjryA9&8n#pW`NkzYuibM zM;)*hEjFQ6Q=VGd0h(owC0(0pp%;7Zz@_YS=L0c!(tZ~I!>jiZqb3h@gaRv3pU$a5 z$?)$BPt#E&*5>dN$+FTf)Nj&~?)t1it&gIP=l8R$p*1@{zDdZyRXT3DKGEfGB(9Z1 z6m7HJb^V75W=H=3g%!D{H_J*Zqg$0Cz%E8MG~Lge9vz)^8vUgPn2toVB;NtKlQ0+g zy``q9FLB`y>x90|m+q)6<4UO%$k4Q>nYP^9kowSn0JfDB*3+^@!9C6v%(!|Q?4<+Y zn9Lbh(ss5IJokp~^l0+hvVb_s%31SyhCJW&sGN>x+{>PizNyFq;vzPVbEg~+pTs>1 zEV+UaAPbpz%X5hcge%v^SbO@Ws5(m$M5pD2(1Cq;TKNJX&at{6Mej3^jv$8QFK5Z^ zPoNE8=L=pQOGA94B#lL|QfnVoa*9T@@k4tAnyYEIofFLLgW}K%rO_#X8jUIc1LzML zYSNI(#f(Q}UR@(-C|-_TKn$!J^t;U5C?<`)ZOGN7Gxm{=P%r`^O#mTAfJOVk!DrQ- zQOdQm=YQq8ILlb7?h$fa0v&xPalJlblD_Na_Dc=~`9ew~Xo))eFpPR5rusR=Z2X#$j2tW1FkNY>lFpT z2tzb684L6F@0~|Rp-|* zRn}F%VAcK`JVhYv8wPXT&X>{=PyG?TF)KI6F;+H!@*ZsWJqUr#3S7d?K6J2*(s`kD zNNVxZ6qCmK_&oYjcW-ThgIuy$3dCN_q=%b@FIb8^z#4b>DqN(xmMbir&@(`x-PjaC+_mr1Y>y z3+d4*=r2zBuH(8qzxA8b`C{xH*vJ^uM6vH?iPpwL>8b~ujr(9r9hW&2*EBnP$Wv8N zKCC3^^e=k6?&#^lCm*4xF}9QC2e1nT#&g&67{kt{F_)36(3kX?7j7`mOull zuf|%W)z}y2=9{dSN0h!Q9H)LpNgEiWXVv|Oc7sgh+xLn(6K~#R*g<{%b}q4^2V*#L zm`IX%G|~_bQUXMnq{5FT3GonvYZp9;SC4D7Mvgx|YjH`tN2PnJO9$Atv_XzhgN>kaV zA~s2<6xmX@EvHVbR!+$C8-q0{H9J*IxXdRi-{8FKK*zr@h*;TvC7NoDsIYSH^v$nx zJ(TWB^UbYRe%6_9{$3xZf9!}_Fn^%RP~_;Q4=W!5bBRjq2H;ukOcSpF-=^GG?)z?* zb)z{;F-MO5)4POxT)x}Z=k{cpL_QJH;o{4Sm!BoWTpl4N(;dn6QA?S=Oyg}ATn+Z{ z!P-Bbq_rLx1^u&rsI~{d@w6R8msrdoKH(a$p-H{0W^|O_J7_t%x7@NTH>^?zazrR+ zfV^~r+yhIN+$|pWrjU76izazYRkz;HD)<%Mj>bCEsz%@g zi|B0)?NpMqZ-_^{n^1v}=Zd{rc3FFy1I0(+A4wG;&mA6(VLHLSF8(yb54!G2Cu!!*L#t?G(esc&#Wz1y2Pz9)dI18s5(@Jv+Pe|7zOMSDrWT&o z#`(_Na;bfv4p-(xj_%`krWCK@?%o<3O2dxMeNfv|DgNN#Dd{b>Y!3`2})#Y3m*a?7WY+8Q5zgeJ@buLKt8#fUbdyvqs3c z`QwA1s!y{H0FF3&rAm>c?{&gM5t^=yn>U>Xd+xByD!)GV784FxiA^fAUa6jjHub!}JjuY?D1`CdlP`H|RAaN* z6sg_sD*z%{-9x0^7hB2a@6CFS!8+LDw@uRUj=pHmh5J&GFk`NlRUfkvcbZLD=hHc! z-e_gns#^;GIe&iFbmibRjFN=>EwWX((X)tv5uWuLBoSxKP=}QSa)5zZ~!b8}o%%;P5-R7j^iZhmlQ}^s< z#o}|5d(^0>+UIDq%u`@8QpQy!H5Zo0v~WwI2H^|J9t& zuP^B#op3x4))>3O-Uh#44%D@v!0PaP!<`i>+jDNLyYq+96@d&}8-(l?hgX^?*{-|V zfnt_0ztFeU@!&8QNgpZ+XXIfnV>9o44hUuo3EFVHC>Z;1vmL^<C9Xak=w1zxm!$w&t1937cO`d74q$te z$jy_HEXO(je0l_Cn0@%ZbTob#poI+PR`g*k5Qtn8{mlDF5;4sqznNwzh>6Aws!eT( zs#o)y>irf7=WGEg;moa%s|wLx z#W_@UjEpti;abam)To!>LQLhpt}2Mv+Gzl$CgRy!bCI8R54}-2u17DmZx}uCG@s>; zjE|}^31pQQi0oH1#o(=8%4W>kS@TQ`PlPJOBG} zUnRplw;3ea`U^S9uu7p?h9xX_-eUlNbo$IltAe+2fLSZ{sFRufI6JYq^hthq&;=JK z?hHTykX((Eh9mc7Wt-Ken7#8neNZmWn)1QdYg5Rc^F zSfl}1Bao~S;bt2}SaIIbVhO>)R)*#4lX0($nm)$}TWd$(YV2X|oFi|^Zfrj;jpEXB z-KqSwGIbr7Gb`_;U9(3|?X2zRDa>!@K%oz z9G^^QMV^bPZm95hgSamYioFbe=k8{{huE%M4Y4=fWTI%9Q| zEojWZS9Q2pa~8^3sfDB-uiG1G<;TJC5uuLBm-)JJE-~4k2*Im{fPL9G6?Cnf!>3fe z!YghM(;f(VWgO2T&qw;Ka-WTO?7x=DCi;EGizVuUAu|j}T7+KqrRELqGPI`^}MR__-;NJO}ns^ z_&XB`_;wLQYy*M^Y0|KGlURB3mJEi0YVt0IxbRiI(nxhp%tSzr3ILSh%vf$v`?)i{ zs0hL3mmDNA?_PC25R|8Sd3iYf+Dg#jJE|6?3qX%2%jLZppo)S=(6)I0yxYFvirZlg zuVjukD#~sD6gtH7JdmF>^a)x&8Ow~@5ArYP`)yh;@~si0kfeWbreGa_OZva+-V*0X`$P@}4Vc#(ag@wcWd`3PHt&CdRez(BOrhO;uO`?9y z88t#mycI09JL&P*pD7E!*(ZIk6)SUcNq>i}rdRy5q8<33HP`PcH!3^9l2XA+?rB-iq<|zH1|jOvyv8Y@- z%NYP3)B;g*b>C~owh`&c+pD^&1C9BfS|d1mnVv8d(?bqYQHz+ZkBcPIn+*wgD9ySM zF-`5yN~K)fiald2r1k8(>FzHwj<#X8r%d9sxVedl#M_9oZUp+F_hm>)0A_L6V_lu* zGd4V@cp#jLJ}99STn1$PX)7v&aN!vt#rmlVR#Q6O%b??I<15L~enzfEWJ7|I`G;?c z);|soD58Vb!p4^GzO~=M`$K)ZLZn4s2qd=c1CzBH&)lNNLNCud3x<5Eyyv$X8li4T zuyTrE*mGcjmHR!X7_xjSO_TeiIpjopaev#RHZGtVf!~3co%^QPmd=N~TkvACvR$z# zSu(^{JRtw~EcxRhV12-LKeFgdWou^7VQIwrr>Fh2nT*d=hLAt+t7oN+RdrF_y}XJ~ zUKxFj6jarj%%9$Yg{BP%S8`aS4k;av@!GVW!BHt8`7q+8KU(o5}C5XEn`%uaH}fxDVT`6kZ1LI zG)0QuZ)0fj>QKmcJ-LJ}7y{uI?sO?cs0om#1X9**c+T$bGEp7=Pv5&khFrd%e_xfgtLv3n<<&0l;NZuXZL}d$AJJ?^$nDE6Hzg8V z_G7vdso`Nk7^{ZAT3|nSpnTC-`LOZGx9pws9of@Ip4I{euI)+VZXARh#RFpOf$l~j zadgRTMmql}zk(!wJf`56Kv30E*BTGLFkex)OXMppuyQq$D6^C-`vCT#W*&RXwr)2% zSd16>UB+a(9{tRZvUt8{8UY)Pw0-;B?NTD&^0m3<)t$|V zBJRDufZ1Ckf@6Mq<@YUjUafp~q*LU6_KX*@)my~1lomwS`Js^WqBm7C2qABRk{OuC zNe;cIBF4`Q-9lpiDvNji$L})a_+ zYbe3C2S#Q0$DCYKJTb9|B2I;ITp<)G#rb)KG z`c#VthpU$htGEYXU-8q|%=}6lT4RG})I}Rpg`PFqbD%?~34s!R3kk2QRQI~1$QCPk z=bEmMRt=PVHP)_+**tkVE%vnheFp5M4JM4m!7hmRYv9}Fbvi?8`fydXn40}M50tiKt{*bNA_FV>!rv{#|pb9YRzSi=Sz}!oIg$^FFA%A@b<+S+ofcup;0vtF@ zgn^3lxh@qk__`U+w33kKRzB4WklPgyOFNP(v;Okx;!d=%=-LKgEfXYiaRLah+k?{_ zTln3Ot}hZ-l(4SJnr~}oMt|-O!DRAvxmqXIq511lS3+kHb8MitPUSdn*eP>T?&+UI zleDklqL>%8kjEhj0kZq1_o|eeO|4`HR8dS8MH7`Cf`6`WQC_FT4c1BR*HIPTxf)~1 zp_9sa%Jr$Jm@u0m5filUy1p}9B#UH2q0PxVku)y|&HgXuOzZH?L*vt0W)oS|HABp)I*` zm8-vm-&X$qC8~HcXUNAVfRZ%Am1W>$!g>|)!0@kn&@!yS=VJvc8+=n=IW{d&o(@!8 zl|8bO>Qds@aBKMN_-~Ea4d;ZkZ*4pA-98Ej`R1Rh_0kD<#Bc1T>+(D$DiQJ-d*$Rg zzr$Z3^1ANy+VqU=90$e!RJP!a)v?&%Z9t~{8D1PV9{#$07B^v`_ftu-XYsLIj~A@F zY5qTJ@L{v+^UO+la=~rornt9}HP(lvvU-5OTx@%$ye!ZaZK9{&10& zisRM&%^%;Xke*xPvy8lrn!5XI|2Q!qx`AsZ{z8xnpH-Wo(hO~L10qL~#_;*LHisml zB1F_U$<>>JW)R0BO(Ks6^Km|Vc}&QW4nC@#+-0E@M*bg9Vr?o$@F5G0Y_!wXg{^49 zvp>X^=G1~6t@t~cOG4L1@C3>x!uD-L13l8=ElabM1Y=$zoj+rq)6P4I2feLtl-_D< zJ=4+{C*HO?HS>lQGv`)3U2YY=U)WOSI<_;vzS*hP{#P3@enDf~T1~2DNr)Ul8=-xe zurQ>Dmd4Ztz*oBOjLqeMcgFwj&EQwp1@w5rmV{_~p*xIcV#@sbsX>KflRsqpQXg-y zbgF)HzCXebNPso;6gVk8q z^S!^FS)Ys@CV0GP-F{OlTgvrTzXrWTd*dj%G~nQlZ7RFhOs(hsrs1TD_*;qp&OPjx z#we*}raD_+chopB!_?_|qDpt$2S$`EpU&xh{=9B-p{Y8CcrSE~_xUxIQSzM#V5RFC z7mCRn;EUb2v~=ffn&5OqB`UEV<@t+%iU3Gl3WFlXsZJ3GuPC>hcEQ8@FcvP9LTbkxZ*?KSXW5e;dV$k)*Va7y}$V+SAuiQscFEx|&?k%+TP zG(N(hRh&6cV6>6U`8M3$A+lbEH8-z_45`6R6kTdp9;LzO{?S$!PYoIvON_?Slt^_4 zlSa^hIe+k89tX&Dd89?rQ*JJD-Eb;N*BjD=G*ZMcg}JoR3@D963{ZbTsJctjjZlY{ zsM1x_4HH!PzRYVuj!AiWkEnmBs*NmjX3i3RUfU;I@xI=zq(NMRww^~*B=3xl|7#k& z?m*P7-fHupBDX9k&?t87VBm)_MR?Iag-KFydtj6)^XsIZ^W-H0ZVl@(Z}!qSqRWi- zH}-yb-KDsA_?OY=QT@|;oV!`%w?F2JcUjLkNZ+qD4CPanO5aQ#o64;j}l8I_h(_uS#ggpI#k(G#(5F2kY;g=@zd#dBYO(Hng-hj(fm z(2ur^II)NV(exw3Wq+LMY^{&SpWSRp)hi(u6*aI+4F(LiVTw|8L5T_=;dB40{ed}|K z`hyK0G$@%C(uM)^r=M8h-9L7x76w!?-zWN}5aLpfhWrlLzXEMcl6`2_mrXoKu59l( zY2wK&51!d|SWfyeM?IZ)9&JUWGE((P@OhEgx=OYQ8RS>%$MCw?Va7S1HX#p*H^=ev zP6SP*eI2Hxg zS^T-VnbHGpn$f`gbq5W=i94Ccn^L{|y|(k{fiZ8~FA*C9#MB zvKpjM`$l9Jhyu!Ej00{Js65(SH({q56*Bz;;0NgtDI+_DF_3O4m>`heSEu2B$1Rql zTM8|y#gID<$35ql+*D~}qM=?_-&E0Ln=JpAb@Db|iQhjpl!(g*7WLbU2hu&7=$#s1xRre#& z^>Y8MuUM5|v;2@2Ioa}185a#5-6g-(hj)yt=RNMPY7IRfsi+`-+6jMBU?%Zutw?BZ zF-*!TJ z6Zu`&LwF2rK2Sat-x<6Ljd47BbLDtG-u+d9n6iVGO1kxbQvHemGXHvD<)u%tX1;$) zuPS~Z%dUN4qKtZm@?TlGBbb4E9J46@^0hrP;mBik&)CZH>nW(jSNO4nukM(vk`&7i z1sSQCvajCx2x{s15x}JK3ILc&vRO($--(D>*6xr^=2 zriHV95Q}Hcv3T}cNlJHk5!Ovy2BPJ-zG6e{sR(hg05ZP{=So^=+~=;1jnfOxCulJ_ z#+WtTy)5MUf-afC7k|x`=ddXqmQ}gYfh<^Kn^UWFISLF3D?U>0-82daiC(%HaN2)e z(}?t&t}@i3ZmR-qP}@`VOlPv2@WxYUWIm+lM++?p>ggS z&VPpTX83JLu<(T3y=p!9c303w=|U2xU2tZ;32yf4ANqiP2Mv-O08D`TxG8{w%>&|n zaZ#V4$vzr_tZa5)o4GzYea;Bj_|rpQP_ zFdvEg%(ZmBNWI@eIOm0kqn#3Xumg)g2N$N;biZ=+U%;Vw(nmn7b0*xnI|pMwJR7s& zBo!$-uAKSP7Ldf#<-^sRPQkQF*#gzK5$mZi3e|qfSGg#}-(O1Pu>S*_1|a2J`U3GZ zjlq%?6ia0yx6@Ot>&CbmXKKVOYCb}9x>*^E2lSUdo^gNpR_ZKq=i3Z|F3ZttGnt0| zbS`PEE=iCekx`hF{UNmXFNyHIx3#g!x;PRK|NiEhfN|X;51P2y$xr)j5OFzooU!Mf ziZ!w}x1>P5M200>4fP?<2^k%3$e7upl4suqt0Mn%e*YRQ%H*vBp_;b9N5^bTU@qPb z*N1DRMYJA8soecJST*c=D4k)JlLQx_S=QfQH4ByfkmIDO*I-nW4_dm?HVu$JQv+_7 zo-6ECgvjR07_R(%SMtbL)J}M<4Ij_>phM)0nfCktOqOS}U%c#DmUzwe97Cd)WEN5- zi$I^?S%XMQJ_h!6e`eqLBYcKyy>G|L!A&tSD^JdS0LzgC-%iBz%%rYRL-y$Y&3N(O z#x^6BE>@%(m`I69u5^Ht)pYc#{&S6-AAtu_&$?rwWY+BdF^GoT*pRDnlTvoqSHpXL zkAt988z?wiUWvBg8O#;Vs*+*+P*89-tIfAdJBahE!hRmx+l#x_=eeZJ6$bhkM=-MZ zB5zzk3o0?xs`OQG+fSM*kF<7&HeI`rr8r{Sep((?E@B(+`N9473ZO3M)L~y8_0s6C zw>3Zn6W}d$}SxG;_)}TEPD@kKE}W#EGpSH5dEc@fR&mh?gF|!f?t;pZUV?x5YT5jaqNyj$T#=4BS z#Okc488&)7knS9hjI~_40F4X|yEN4QDQtKq+@;jhKWydWBM(?oXH!=QEV6-6%?Sdp zJX3#$g=jZFrgst`e^-M4-hRJAHmv?B&6@SY#GrS0x|-fe@YUrh$ZFu&z>jbE#o?CD z7(D*XZNxNARg85|QpL(vhk~B_v?4kIu$4A>tnAJ)oK=)WR02N;lP@jW)Db`mE?345 z1uHWSTY5^nCngmS>{n!H0qb4_8Qv4=K>CF}u+~)hkEm~ zK1O5k0Yt?U2L255S4sd;J3Fh_HCXaE(ZS8?d=|e^wfrrJJ+xhTa<-XP{*2Ytx@tWP z``W(<6Yk&XJS*=3GmY(r-tOGdE)MJox4}DN!ZW7Ct4KefNK>oQ=%FM!&Sta6-!Rwt zZA=4|y|q`DH9DU_T3lutPsRmHk3Q@g21*nVM|HjRec9U%d&&FU#kFia-%3}mAEYeD z-^dZ3>AR`uO^ok`Ub;Nt9BIW6EWCq9)YvA+{e*vsdZr_?-l}ykE8~Z%a(lYnO&AG^l73=)dz;gWcIsV&TS5XR{n?ay zv0&~vMA3Ym_28M7e$jO}-7se>8@taJ{pNNe#&7I`a7 za?g{9fcT@ObU0K?HfDk4C0Qp%2t9Q7*I{U^`YZC_9A_E>OD}G-OL^oA`ICoh13#@;Cb^crPWD^M zh@i?H%_lX%+l1^}AE}XGdisHNvIU_OrZ9yOTBA>!xM%rb3;uZj@ga|^ixcN%((KfMgwwtxpzMH1XQ`Lq zzy&EwG^}y=c%W#eWC`+ibn~YwId88Zbyof} zrQni@$|JqAj#G;j4>_Wc{v>|g9HKio@~N%hcz?pnyNlH!1$SaOw7KG18Ra?U6=_Gu z8X96}rNJBpu1~7XZI}r~E6CBTv(=ofF9~~8*Pmz5GIks5A0^GV8*iqwU#3SoBA$VO za_>ggfvDaCF?0DWuF3Zo?NG|Em1?%v$o+~F%Cl6d*H zABz){Asf+rKgsI+6vuN_bT`-)Mm7SZiRqTEznMGVIWI1VF^!2$diK5Y1F@iZsIz$e z1P^>o`<3$w;i>dT+|5@%3+BN5O8HVYLPs{_$@{jH{PWU` z!2?_X3d{ZlCm!fBpPh+@`CxYX)op9nz#ye6mP#YPu|E)%LEW2RWlwTw56IA!tv~r} zkewj?%2<`oNTQ2}jjDf<65^3DC?nRTMO-W12`Mj04+CYZ@J)m_vTdAY^-7R8Y^fQm z>pb5JtAtUHY8cX$WYVi3~o{q$>xGsV*PvS!zBfr4A%1jNVFngtrw2HH3#7wx2;g)N-aa!5(2N>} zDLF0qtYeX;_+hzq7S#{j@fb_6rw{-jHr5*ovntUu$3igW z>>;sdl5}j_Af{3{sCP-$ZCNri1#V7~v68Xf-@ukXR0t$XpN)b9QRho7)2Op^%lnHu z8H`o2kK@wgGTfM`6fM8*kZni2x$(g5eTAT6O`pER$JSp-<)fr@%~JPDeVhs8E}=|~ z;;wY=O6VVQO_%F^_E-i{A7g6}GKoh{*`uknum}#UMaBE)eeFc2&(^h8wC$}IB03%E z>ZfnYG?vjz^)2QqUh=zs;ubYITGy5Y^xNvPKNI#fwnlZstA%VWoM;42 zujwlUhgEL1hb3tu3<={@&88bt*Dic>bMI-(?+{5k^f-8)9bavJH-!t@Z3L5zzcqOu z8TnHK2>-%=|AH0oZ|A&OW@k&V0=%AYT>pfdkkmHl&+}b$+l&m4$`BCFS1d+mxraf` zx=|CAmiHB#r1GlsM}yO~|3DbV&V7EsLJo%FwwgG` zRz$UG4d)k@{)`$(fX4)uWysM_%cH+wTkVKNG;}XFE@I=j{Ca9tdL(LxcOeS8Tx6vp8Q6fzWgI6lsH9^kbHm(mv{FZyp(i z4=Yp%uMNmEaO>5%#!)7WR4QLQS{nocRxG@RX=`1-${!d}`?RZm6B)$fIoIWVz5-_8 zADcZPaeIzfR|k*nOA*@co~`)0ZomGX3-1|rxy)YX zAIVGf(2*l5zFHNR&f3l>yAdZYXPfvrd7sw62i#;uyS@vKu;m>ep6J)8&9~qZ^0tp1 zSD3XnHJ+zhXr=pe-Dn#T!`;M0G{0vSLb(X+1=y_tfpucR%)CQBBaRG7ae9=~$O$Dn zrJvP18U-Ipy{3j=DTn8JPt32LJH7~T^)ZfCu)*YAD5g>4FzN2US{xPAOyrb;MB%()yn4Ls<58^}f(YZo3RybzB$1gutp$_exgk0tAZJWeL41 z!gAl4g%5n8dHHiN`BYkFIZ7Jmvw;EHuB0utBeiQY8Iw6L z!ya$Qsp4&2eucq@p2}Mn`2)Y+D8Dq4;%VLd27869m_rjJsQDu{R#YDkhKA5XWBB}?-J15uJbw*(_?-mUy?4U^E97?iUC7G-i^b+mv5B}_(C-I! zyPzH$j^y)~KE^??NrDl1bn?q$)K>_Hx<4Kvf@~@QXD7%88woadVa4W@*b=bQDzmW? zN+4)6W23;>_e0<5!W;Ax4g#599-3EI@don<+e6=mI52cWL<#5-=IqIfKvaGOQ605a z)-a?be*YO0q}d_JP_pUIyDgqE2{DOzXY^B&=;N!8!Q75LO3q#z4hL!iYKoB^(<#7M z^XCre?GsA|r*7j9+X=n$oH`DCD)o(QlaO1D7>&A8#f1$2?@0=+s|t`%YQEUh5ZqrC(U7VBJJ6 zbXSvI;3nmwpLn-aq7Q~&#XRm)Z+y7aW>3}+ifQ33$J89gdigixj*zvoxh;IzEUdfy zupm%&t~w`Bu0s$EYxryV!M*(@az8-yALxv4VsY>KM&O%=Fea9?$}=RjORS&g6U#lV zvF^%(L0v^#SQJQUi#66Im1R(@+$XVRTQH5t6A>ie5NcC`(D^&OfSSTR~*8-0x|f@xRDxbL2E%h>x(yZ3)F(X9RYk z!6(%PgbmtzHj~wGhsW6DWuAlBoG~_O(k~0Gyq&Ga{sIDEmeykw>EUHi$K!JnhDQ8B zA%xfgtnFFi#jwjvyE~41u-`L2#3GPQY@#}#M};3mNS7BbOAkG-RR8*ms)K0}k2Oc5 zQ`FCfv?DqOS4lYOA82&BDL7V1sDd0F{ft94yv&ADs)A{btSo!=E?p3ivzK{DCb24G z&nt3BGO&&Typw0JcG*ggb*+(gJu~#2X4ZP`q}= z*9qQR2OBJ^<-nDm9c z^crFPjm}l9xf6^N%QL}Lp+3R>aVKQ0p5wE!xe40~S%CRIoayyLg0b60k9*;WQt26^ z^y-{icH+-ouhq-4=}kA@#en;=l(S*1In*T}*50i0N6W=kkMpu%rwzfxN%qr=!Vgj0 zB+FyG*hAOF6K&Op-*;Fbp4uiwB3e!MQ&XP0vPW&KXyci2Qt=|MM&Ft!8 z;uyY;xsD4xS{!ah_&11Gw>joHrZK~)_HK|K4&R3+dj{kawYk@@{!FJjfay#=Z zVuG>;p^tTVDpx79_OmBt*sD3?47rcL&sx*5$fF*rI#t1TJig2>Nzd1mMYW+huZ?EU z15|+RW&F?Y4wp34>m$3L^~&{EeV&vyj&yxGhMY}Tai50!&loTIZSoO%$Jlys8_Y|v zeBhfTkbA>VKTtX}EQp>k0@f&Ij51@#DS2H+%t*$G<_6aEZShLic+gXPT@+hG6f1|yPJK%n@8AH=zJtx)BH+GydpML zPWW2c1&!mew4bHKe$n*eRtvwtX`NCO|IS`y<_mw;#Qxbb`7*C8zY$lm$j#SHYVj1& zG?htZmrueV=Z>#oLSj#lL{}DNPuC6_x2t?L|{yVz6g^ zpci!pH5UA#LH-S#gr`TtDI(LddT}HrtR6QAE4_uQ3t+aGLt0HcnHV;AW==~d6C52o zHlJiv43#;;EZj(nMC-U^o7PD9^iOcNGj zZNG&`>EQSe2(Ow4lPRu=A^I6Z<4 z-636o=6YEEN`uUvlS|GGjC^C_xuZ-04?kv~cMSt^w{i*2M|}Z%CsNP#IJPiF*ygA8cKPkPX|8Ha)E17HxcuLcPXvfF+sM9e$c6cctNgvO@ zJZx&E-==pt>)TM|&84uf$pH~F;J(y8np0A~xjj;kaRa-SB$Sw+EM=94pme#;VWltC zy~~M-6_39d5+QA)jgTYgpUgk(`(Jm(DJPDO*KE2UOp?hjl>3AZ+aaPe=B^JY{x;ZZ z3n^OJ<2A-29IwS;kPli7B9tY3 z9N7WP!ID2=ZefUMFoOGqWPV(|boApS(oJe9%jPL@oj(y{vZyI2nPu6@SbEzq@N6LK zXJvMmu5}MRd(Y9+WK=3U-(P~s06eEBzugFNze^dU&f-th(N`09Q%hiYV+*X12MHN3 z)cn;WMDWq?tEQa2NzxKQwLSn^b?!ogg1W32T&BzG??r9Z7Z*{tzTuw~397aR9W0uV zmATB$FLu``gDg9Z%lc5=T_$FjAi6e|^CnLZd`20obuX1T1&0Nx#JGA?WffDG>AO6g z?PTPCwS=wHhRdzsMqmwmAmqjiU`hWYFk!7rD`Sb56%v$JqW;g7vSo4EJyCb4XxULR|qCt<%>?>_O5P> z$7guns|2F!q8gLy@@ghoX_Doso{MClea18w??AB`YB(Xb_Rx|jFG%Yp-g<3F=F$f3a+8=Fx41jhVQZ-bYKJP({IO}rKCl-FwkP=n8ff! zH3BH~^{q)s)g+vzy8{pyryvOw`A}YzMvHr&kH%{5teRuFx zVDCUpoj7)wThh!Uq-f=s+iFel)ZE%!;L8JtC%y87q{qd=>~v>bM#CQ9=3b zM=&{uy(w2G7H@p@W@&MM$5jX4a8pf5!aA<|h%_s>^g_SQ|LZplO7(c6nnO%nSkV>} zb+xC>7r35W4YmZE_F{Sy4tO;rXm4WgK%c+H$*EXhu0+3bjw7SL2~4|N1OHr#vhxe` z#DFwty>WtfqS$aCw&7x(eFrUfhm1yb=yJh;m|2==!Y7p_X85m3l>@RtdajWD>U+Xd zCP$8!Q)VBw5SdhJo;qRgCT~`e|rNsBryLxZM3LO%tc&P zVcIubGWG7>+>)%_A0`17DR|Hq@mC}ArN7bqEflH3H{#~g{OaWOCMnc-kp0naKb-+=^{pj;a~qeif}-$-D= zC7+TSIjjyXH#Md4X1A+95L5ripMR2MnXg@;fJ2SX_V=+>^?<^6=2gLMS}$*NjQL&V zx+*4(z~5HKyC(M|g)-oK#|*{GOlYzx`ukFAmnajV@HTw!BjxO!lC8sG6R1ntXKBwo zR4T7LR4~?h&3+WuBtXfSI{oua^h41P8t-i`1Wh;V+h@1aJ3+aGx4#u6mX9G%7+TWA zhV_23#YZpvR4}@~K3f%^_TYC z{IqBRD{m@b5$#T@;!gppK;vC(zVIZa%z$bxo*NS{1 z47my9d<-HSR@9_)0XEox}RF+rw%L=wGo<#0dnvOGv^jy%i$#Y}DKeFtPE`C)CM z0bUk@v0_WN7w2;fXd^V}qTm^3XUrCNQG4S6;qPzof0U%rv57kF3l`Y_FlqsxEgVQ& zX_tF_!=$RMy?S&q2yAI|#9I6#4f(|y9_GRT;2IR)BgO(ASn9TXusn=~`#EUQkoSccI|nvP)}p>R{OCOg*7k+FdEgqz=&gKyXQjp26AenJzcJ@a?yesO!t#B#4f-mPXFfeCC@u z+-})D!ZKDtwOFo|s_ABBFunkS@QtwcAK~i@i4xyjVe=m%ujl6LPj^tX;bVx~Nmc!h zc5^6=Y{Rb>Lvaf92~{Bi4yR>*=orj- zR$~2F5~Oz5@X4bRu^{il2?bjJbY=#GdOKt`=AwLC4;jdED-C_@g2E z+`W>4B3Poo9+7-nrstXY@!h|@EfH0Ntchpej;L3)9Lug^(u4awbSa}rIcMA|aB`ac|HQv-> zVwq6rK_56*;G~K>?a!c9_adL?u+w+s;Cquam}<#i?yAWd{AyTe)aQt-dKWJ3=8aU7 zIJR*i;sKtdc^Bvr;+!we8EC#ReM80L0B1pFVHN%O>DY9=J{qbOZ!*yYJ4u~`#W>>v zVo1oRJ>_MkgREnC<@XKbNhyPtGBze~xGwox@&YA>9Q_SJpbeB*R=k}Tp*}bY#VtWVV@4pCuo*ld}7ftz?X#MbkO1X*ooBLX@o@?W_`-a zcAY^Z?p$qJwc5XcK2MT>Wpm}FMj@Pcy8v+RupZRs!qC04_7-+8C8S9zMWeFSuc<90 z#HKtsr5)Q-dV(O-)Avt0r`c1`9MI!xu|hRyFqSM;!hW^zqWziBLtBP>)b+u`Y6A;DeohHk&yLyqS_VZJ$?w7(F#+m8EHt|(Gn zqq8YJeH9^%Q{G)dh4CO|0a0S+bx1a>cYfd9m96Y;YO}dy$O*D1@r~Z8XYaDCkCTq}{7exObsGLv!lcvb$@>#6>gbt8- z+w4!9%ujhQ)cm3O)EM2jkP6GcE?#fDo78@J(&aOWPbE{_NnUxI%i=40&`gfE_cpRy zdI?_@(ZA7m>DYlOx__JgxgaY~m+`dG@uIw7Y2R<*8$_6&xY8YS;?Zh@0ZM&^h*4Gr zM;DD$(X2_`XBDy3_WL<%1fh9_qKGkHpvbVV1(L3Rr==Dj6UT3yW1S{Vx~_UN8ryRw zqJ#?VTPdYMwtLT!Z90pUw0{IaHkOs2o|VN`3x&S)u_$o&zFo@GM|7~0 ze;Ew8KZqV99cqAH&tg87$l91_soE6OG}x#J(W0ml{EaOFWi8%6{$Acl3uYbC^xS4g z3A8J;%o6NJkzy-#_PmPqi;yEP2wId~`C zaN)BpdKoJg)MC{aLP(8`9uy*5^gKju$TH|hX0DUP$LL+lVcp>*%k5= zne+8%uB@QkingmXa7D=9>1m_?K5dZVPf!SIz=}G5Bl=PUB>LRa_q z!|${Sfw?V4-$qpTtz}QWUgw^>@^&7j`$pYHEN(A%ule0OkNMOzDb}>;m5qqw1R`XdDyz~ z>Ch|CSv;pxtOS|~EtHxiJM2-&V(q{xFW9H7d53n$#d*LWaCq|BdkvL@4sg6&e?^(x z`1UkqB+Mj@FHUZCEnMcJgbYi|PMg=9qoAY*qb3qav%Hzr3xtp*B)Uv zv~@yD-)Z#i5Etbu^7Zue3?_{)5E5Xxb#Syc*_>X^Vc6e<;;iWjOe-uy@d2F zikjXpUKRIIXJ`mD+ha18^w0J9SvbZmq1lvl^Q2q8eg>QS;zYwgh1K5sj7^B)V$@o* z#IJC1wr{Y+>6Nq&Fs83>iP-`ufoa$4f*#C(j(V81612G*Hvx^)xXiRro(c^g)-)l% zi<_~*{{WZIG`}}GF6K0Hx`xb-8-S&p9^Yd*!G*#Xz0f+6ql@}39aiGo4GnA zn$ZS}*$Ct{8+;T3Pud}f>HU1v$e?k{;q=kB-RY00#cqE>AqiM_2>Jp)o-+y26_owI zd-jNsU7jb_ZDS=x1Ld`<>|Hy#NNzDFxn(GL+@sRPCy4CW3Uec5JS5|@3sRAnKChwi z=VblcL4p$-9eFOcQk38HjFG6ZOAk{K6C4bqh*a^c3Ws+#w|ZDB$3n-Hu!i)tFq`ap zt9|H^6TxgLw?fr0r%im4$kqyp^m!I>gg@#;LaMT9RroaEbT!F+VJh7&d_e!%?-->5h zz%R!pk6r$OV&_|c9A#+@_}fJugE6$Kue2c-ZYu3 zpSeTEP(2F+;1M;VLMKZQMrt;#-!oyD@W{!>EQ&TK~%V+d0>oq73pM2zVFk znaO2Rx}v>a&y1aHg9{SgW;caiy@Ekz{`=olq`m0p-O+$QOnyln&$lDrG6f~H7InsCcUtCQIeM;Y)QVYoB8U#Xai-*!mg1$+(GsG75SJ^}RaC&V zZZ9E*KOQ^mf$%msE;6xZ%Oez3jn|?DzZBZp(_U8o_9L8+0&SvE+=0Wg<4Ie~J15(3g^aUkt2JE`+ZUCVUJJZp07hcqE zuWlP;A*bJ#nE}CHD{u}Qgvw&)Z^Mr%Tfe!gS#e9{V&rFH%P)kyl#egv1d)r~A#{(O z5EbtNyxC%_HoaDrNr0HFIL%G4tAP7IQ1VKF#+j#}IKfXEg@XVjM?0O2yyG6!JedXi zj@nwQ=XU3h79{4V33#n7>R#rM23pz}nWG!X0QR$gpgh)b3~9Q&or)Pc(pWq+2JS)2^OX=ifETG?y-2YPgFrvzZw>ZLLu zm4TGzHaMU5qp>VtDpy*?xA|`^L8MThTX|mqS9Ap&pVTll)_b(uVi~3mUY1Gk{l%&D zi?HPe<$CcS=t#cKrRX+le&COS0qv6f*zb8-g;43R)VX^=3$;VLdIfee_yhLGy$-0_#X_k()slDkCWw=#(}0qW=3vAYfn@LDrvgEBiiEU+Ndae`P7qB>c2oVq3;xOKc1m zWPi;`CsvD&USPz1TTU&?=o@gfzjEL1?Fe?|%_A$>`lx??=-C80e`C!w^Te_MY|TDH z*4`bhw#z`SZtM_9sjAN>6MVF^90A$#`jNiNGRgFwZPdQRC8#seWe!LoE#sOqqO^}& z8@q%(&gPLl=4KxlBGZFJf@U!@W?I1FH#${`1n$U-|GPBt5oaC&s0XOX1wERl5@nq> zZ6R@t>GpphF9#s9*JfHyuwz$P^=gDh*SA=||59{7M45m;n(yp%Yg|7)|8-vrc^adn zfTMf(;u5widZBf?!g|6)r|`A15-rVxX1h%Z6WMhh*co)i>-=M-@0?2@Y6P|8{u<~I zDFLfzCwTx_&_&7e#|{JLG`F|J;1fuWc678xYhP*ofdKsYH=s0 z1@)fP6>C4tqWO)_I9WbjgV zM5JHlYDSza`10f!YQ5Cxv_8vX|8!^IkUh$>DeCN%-BSxgi`S!q``4$x|Bt?{Q7(~L z(mO)7F#4+hC|2gGiYY?7t*$X@+yU?4fK8#MTUY;_Lq?ywa$Kyl%3`5o<9s{uz19Yl zn$t6X+>FU?1n8WE!hlW;_szG~f1p8<9l$!CPt7Qbnsb}#-$FG4;8P4Ixdri-T=vqG zc|>20*n1ZAMYzqLIo!%^^bN@>YVG5^1`Gz0D31CK@v5H(qY&b3*8;1g{=0biUpbj?d%G?C=r+me#L zp6*$etRYBfmW7%+Z?gKfdzLzE!0|xn3mqy4uYhh#d&ThD#pCQ=mXq?L1iDYq#EIG# zcIC>3F*T2Z}-MT_zS2l_&%QQ8}`@ z*E~4SVMdV~Pq9`NcGmA#Y*6t%JCWa;MSC-Rs3o(wPrII$0u<=y_aMFb)GViGU>jYl zd;O~0nbP*ekc3|YQ@@wPWRV)L_H-5ejyO7=>;UtXypV5KDz#oNaqHQ3gr8k1`)1-F z*}Sc{A!# zWr9)91AqrG3&CJebzvD>$Hz$5Z9*##fUygBJz}12-bpO2-pv*IDIpt9=nUP(i-; z-ny(VyYCSefkP)bWRQ~uf48Ym{`;JnwwGPy0Cp8u9P}cQMHVrJ*wH$+r*~%&-#^nb zKXnM-8ebhxSDLf2K0L)Jbai!q7-Ycx&D6}W^V>Ri1+R_GS+rf){~;FKls)r$Ir^Ix5`m@e=_^Diuc*T(m~m*i8}DJ5FOt#I!-*!hw3$> z3z8Q;0;>5~|Gb2Ze)1=<#%&vZo;0jhxl})|L^W9edJu9Hq^nB}x5(4`i<=UASJ6B# z(=Q$p$SI68&t`q2yKDJUQ0RuYE2!f@$=GQnD9Y+;(`3FFK=$zeOj8e$s5Q7D{W`=Q z-g&OZM!Gu)RSF1yL(`-GyfB-iptQ?`^5w-Z^7}-?%9X(W`}Nk}k&I(Rpq4yefBi>{E#h?bIYKjW~Hcq z4o|NWj&*J_kzYQZ{z4uWG3jcG{Wn z$k^CXwb7Obzy1FDVkT%MYRj8Pv0e}Y-hby)_Seq7d%-IG2bn1E&Nsc&4roB@8{uh- z;3G`~Ps2~^B0fY`n{hBA@JsFheqaEamSl(CO(NiI^;uhA8LigIInaya8H0$B;D-xv z$go@o-^9G7Rl%+C{bHfPiE89n&=s^rhbUzWFj z_R=htll-9zEs0E!OlZi~T61E>(|CJ$F+_B_kZ;ldtYaWPppCm(yx}jE?x$%)mS^&3 zJ2lmxlm2E=s`O22Q?&Yr)ZLq{_$NYCWy))lD5Ncul~l&x&TL4wJKX!s5tW>I$otFk zzpPXy8rctAY#d)XlUDeK%Hw26v=f@60uc%>`neMiPU*9MtzFh)I@y7bNalWTvBM&M0#Ah{Sr;qi%=ecQ8a1a zDc%XUMvPN6kgsU91nc?iz9DH9cf}@P`NNNf+wGN+;kKuNWIzawSJ)G1FD&#O34K;t ztR#k4-}U;~-&A_rq-mPBf;kH4TT|a8=DS>o#yr}3nTv162T)wT!<4jb6R{%h4x;+r z-w^ry1J~EzfwWq5Yh^Fa80W1~_=GK!Z{o{*;|YRQAZ0mhv0cD6S^}v)Ewq<5II5z_7rJA|y5mU7l)4rHJf1@rJ=`Mwu8O8>x9>pk3Hk>dw*L-?KOn}Xzs^5{ zc0VIiW}qmZYUIRrPE3%3cf;r$(dhY5V519pWiTv%VD9qdD2EtN&biD3T~h7I(ifLI zxKydXYjQFe>1131ICkQP&H`U-19aDttN3=mpwP2#_}xAv)q;_%2HGMl*-UrjTEFSV zLnS(jU~LoXAph@IBLIkcOF!e;bRnEACyaqwVk51}*?n$NAYUoqY~s_|8{<(90uJ0d zJ9Qmt=g?Xh*RU62Wf!esazG8OX2OYNsk=`Kj(OT4P zJIWRn%En5~2+a>B&oOCKhD623Zj|>vFM1WJHO(KsCXh97>0~IJn0PuFF7P!uE&W-^ zSBM@HqmzuJAG0XG$|>j|9#jEO^;)=};agLn)HAS_X=;RVpT_rSp$ChJ7dEax_~*qHNyMVH-dgo(Q1k~HSrW6bWoC&-k7qNuUrjAB^?G4 zRki8l%yKF$G_(Ju#$J#mdZM()-_g8ObWxaA$mHHRLJ_s6BY%In|J>z=ruLxfTUUp+ za&G)J-DRw%hNh@}RvXiAxd}GhJKN7cfMgmK31*yHsX(@1yAkU8?UW#7Ir2sG6ZP;J zUx_`3-F6ISVvqo1^0xmA4CMa1Jw5o$M4GV?E>*BnUW zfz{WwY43>u3*?mUv*TXSn;dVP6&JR`h^!d#tKDcVE{mGC>)a+{I2_dK{c{U;>(MlU z%{xV~3vSP2?BMTC#`>rLjS4Y(&DyEZ7$fHIQtzEVS7MT*#_j3rkA8H+B>{dt_qDQ>A@-f0Z-Xm6<8lS?PX1zoDG9 zt>;-;Wx`!vTe67Cuk#%TMHcP+{XbBaNe*92ew+MY7#TECOs0vblFqCxih*09`SXA4 zEl)lx3eU?}=r68!Vcr&KOw^{%#G1^a-;haPEPk>{l+8(#HEj-KBH;X5$%Amp%HyqE zppZT0tuXIWzfj6%&ggjWY+?q=%BUs>Op{Wx9kVVoL*?b)<2q>U!qd6k{fMu`HWTP#cN81x`t_=UUFi@QzXDd&(+i}!+!a> z*EG@Kvzv$ueBhhlo7zVy_uU!8{I|faI_%A1Xedy(7P?qP^nMl9x*bsJ4V2>-Vog1< z8cguXy-^fiUF2oJbfN@>UXs&#YhhdAw#{7EE_Ec+F@9uunyf~%2o_}eK|FfP#Xj+Q zI%}CIm`?B+Q9QAPt}d9ZqENUHJ96($XxAgbq_LlH_6#UGrlGRUv=y=K=pP&pds> zvC0eJtr7m)NgozxWg%W+#dnlzP})~K&>cJ=t8Wj6{Vq^kI#iW$EAWh#o?=L%;yyGG zrN4=a`?)YI#0IM1`w586)R!|%Xu=$qK~cn$SLDVqCUV5u&lcEZQCcb}bU5gLCiVl` zk&-+O#FDympudRA?G%#}&xa$=FINsnz+?>WMZxUlk^8n^aD*m|{%TL1k0(ZWHweB6 z>^F1Lw5si;eNEQjq6?Yk#F-pqAHEaX-N8{gaGqW5wzKHs2|M6ySl zpiy=<4z~l6N%mi3l(Mg#ewNwUi=S?OT}2Z6bjEf3dXu>tWF+@G?)sf=?W#pHDysNo zf`d~%Tne`N3|T6X?S$mrZV?oMz2`a%s4&?(7nHN^nrcObSl%@n;iM zWrMzS4tAtbujA+Gu;kC>>V0}=(I;Wg-ICqs|1Qg3kN=E}tHvG;bcBR<%mS9)7|caQ zAi+^T9xdhM9GN`;Z;+Y5&$uC0oif$a4sGT}d-l!t0vHnScdw`Ha-_o6QX^-Hqr*_y>1>ZaW2!(272J+=_XUZy2q5z&^f4Pq5a4_G zo;Dm`%d1$XogeAgH-ka0{FCW*zEhx50L4Y?&^yIRQ9pM#k|e`$4;Z)UmWlR>9|4mi4-RH=b{2=LTpd{#Hw=X`*34Gnh7pz1wKm zS$0uyq^QAt9+~G<$k;w;MoqY78cpv0C+W`bG~ZAD{`^g6W#rzcvqTy$nxMjlKXwPh zVk`{(R6ryy*y*Z}u{h#$EgHOO-joo7r_fm#YMyvvJ0>S^9cYogQiy(FXyun@)%1&V zy6{)r8kDWpT(FCTg_{&DXhif$c!~zcvQgK+$%-~uAhqZt$A**2Pg4&6lSyZ5do@il zH;c&1Pc=xqw^l#)wt?VAzo^my0dFKx%7}zU31fH`3sC8p5QWX;M3C-B#e~ojP`IB^QJJFtix<% zI(-YVM1&;bwUnTg*qA6lA^rwVr1jpopTM@57;oF2qWIejoA#)%1AE7Y9ff38!aBa< zW%eO#wek{eS7DZ)3d{QzvXsR3aFjf|{MDC~goZN(8^3?#p;Hey=GyRB%a}>SMLFE( zsn24ZdJ{$!OIAtlu^OwikpP98$hD$qX*KUHfU{cyIIJjHgf^y|+uwbvS77LG`CcPr zWxr*edF&e_b3AM)XlLj+qly~oWB2W^lwMU4tfgH+IoLpo9Sd?<32to zCpXHtn04FxY!%TRf?s@_v@XpQxf;x;a%G&K-9;o|T(RxG>AjuiH0(XaU5i?Gq*eod z_0tsjy^JU#yFuUI1`x+ge9~k~K>XNKA!J6wh1r`kQTcyCzNx;%mAp4_P#t%ed&9qw z#+-;k_#?3ES+Aqa!G}?beS7eIb^+&udr_FsswNH8!7UvdEm^ug%1gjp=DV4SGZBud zvmEMaj+Oq5{S((G*1pOwO08!Z1Ju`kucwqxE9&G|V$EnuDyrXIgKqlt1LaAo@Gz3+chKwypI z`77kCo&gz;<=yEo^XNYhbngu9fJds;qPS_O=}Z4a>iJE#F9f%_e^q@1FDdmZ$~71? zO|?3ECD@VPn&GL%o@rZS_O`q}b}LJ1a%4EBXB|&g{4){__W3vB;E7|7?H2AYJ%E|y zF}nXX+A7YPHeR5M7H=yC?`@W#+0O(Qdv?(y)+g@n3?KLH*!~jg7}J2Gbof)sIQ;0f zw~oKv2LjO)F^pn{NI6Qn-Hwn;K0WQ9Q*8BfCnN*QyMGFxazdJ4g*RBdPV|p6*O!bR zS@k@nSEarC8RvU{UN1I70(lKP?Tg1Fx(b(<*pIG`oZsesjtt(CFNL8$w=tZjd*0?) zCKCF&HM5Dwq*<*0sXb zvg78?flgX)>Qf$?%2UBn7WuU0rj#b#cd(=9i7x6k~_szVyx;U zYKaU46U2!{Hd{PdP`JNlG~wX>x5oH| zkWjgzo?J`wZ&LRr_tON2YcE0@74DYfrO|3C8&h&6F8hvvUk$|FF=)~{vE^SM2Qlbe z79Z4FQAHH%C)X0(o{q|QVWHPdnMAcI}%WN%t!V zk2Cb*=ZF9O%H8iI?PI36{kV;ksn_JA^WG82*H5}5z+cz480x_`=gNkzk{r9O+Gq2AXc2BTQhbRxE63^1AbYf39kw_R zVk+FK1Gf!wI9Y~J4VZD{r8-rpnP29+?yzp6rzjabd&ewRQ)Id_LYr+gEhU=$%e9{v zz-Tk`pmVwIb4?!a@Ty;IM!1Pw0|^bk!F3D2f1#1nSrtHyX8nJfElyNVy$_F;wL*Zh zI{;MmSKD>@-?nG*p&wLbDuoJC?sbJ;uL@sX)kJ$OVT_B({T-v7Ya8}EXY)&K78Dmm zn`MNoL{Uos9ALHKX<|?pJGd`g;AsJ|5-llNyr22e?tZ4B=(X3whv*@jtrgdFT0S01 z7oPKwWV9o;hc}dQBUeo22S&CxkATOHN0M?6JDhBe#Tag$2H_|$4G(+!^zV|~}Ot}H!7ox$aX&lGkojJx+U za}N!U89&=b`Q3HACqYcKl(^2*TxG1AKpS(Nc*W}xwW-;5zmiPLmkyCetHm96>7xxs zauXSp{siyj$;dYI$l!jzPZXE+3jbw5atSP7$_3H;n(8cN-A|E`{E;2gtg-G)RS z^?9YUYR{T!J0#+->d+A)eo5f!%p}`%@;Q?B4W!^k9}+AE2fLAYp)VE~;*#apJ2QCn z(QX@Chs_gw$@<65sD2BA6uZ4gNfePEga@T9_{h_mcP5(uyhBL*3gWxPD%)eSy{i{% zU@RNQAI}eAI1tlvoOHo8_X+CTn7&uL6v+!8`jF%MZK0SutB`qI7vt&F0d2zJm+0kH z9*2cbUQ%JR&v;DkT-%rtj}~0x^#z^o`;A}xiK6H%DEUXIK@U>SDG%Iv7TDQv=>%!p zzwK9!k^ljy&2|y|5KI@^g<_Db&$#w z!!=aq4fc?f2;`Vgd*4kOu;8!PPu(N^US?1XoT;oYWvnGxe%pL*tok0eKgnn^YGQ!y zTzn7sUz%eKc^UfG^a_1GgOwEslR};={CNTS3Q05H`*L>W1b)1UDSbGA0#QL{%I2Eu zCn|&M!$4acnM6nCL3PfA6LaXQ&BvwAkwSemOGZ3}NjVou*yy9kjxyqgencEo|>>tt`ddM~}>oHHU0JbAYfu{tuMTNvY>t zzSvLYn*JxmyWUG;L;|rTa{a8B@rgY>v~SC&_-#DWEM~+ib2}exE3VMw^~A~r*G3-G zZ$P_?E}>3NGQu|Kj?v;~2&d05W#8fUSV2OJXh&PQv9=DbcXJrQS2aU}mXdE~tauda zQ(NMUQ-cQs`j!HvRzbTuXm?XIS zwsXAF=snRgPwjg88M+2s*-1%D0}6p=oo3(+o|nn=oPT7r+vv$UfY=Llq|m4>eEj^y zc;RnI3)zqg!AmEP<&Da~0?aOZwRgTF6r&?yef1{zJJomE4W*>1brS%sEB;;5@P%xw zD|nB*bAc?O$K*dy&jb&Z_BY_ml*aBJZ(Us`{w_MJwcVsMvv?HM*teGC*t+TjD5pKG z2};PnBt5(x3shR>pVFC2M(HlST^BN{Ecf`o!IkL3`_cLK)O~-A6d9NDJk{951N+dH zp;QT@wY4kzi%pF7mpiTOzr??ko5#PUy?Zeq$mC*=IK>P2QeFmsgi%4~88qKiXJBRz zbz3If-2u&;GNj8A*;N<);!~BKjAUc(K)6oGl{Q41CarJ(KhXI*edzp5;C(<}yEDo1 zvLW22Ts*zGmW#PnuAf=@HlX;AU)mQJSr>cF!dMp|Ay{{d%DhlH$ zoA{wN*%@XXTF=}6K$jGbNkcFz>3w%vR3z&?{4qAObwAY|DM638EOUH;`qKocfW88M z$D`jU=YbNOg>h2Krk{R9;$HUCWj)p8BY6pUr)#UL|g7M{qYR37>g zjAh&RvJlJ|FQ)NumMO*W$=p31D$kH~JB21uPPVNI;1^Rg`V~$I@T%2JSPQM@|Hljs zh8>A_qGp}lpD6>ZUHVa>>GBDILtTo9(-+i26pHbNaox^Q#D7v~VEBQ2^)o z0v0?Q1L6``DG6Rm2A(ckQoWPD77Pvb%(cr_tFRJN;be&(H zRs7-LyD)d&@a9I({oxngf|qa3wDR4hc@yTcFtT}h_dO>o!JyQ!*x)^&XGrx`+ZpPZ zoORRXyb>dE9|BX`Zpzl%nxqaX_kE2v#67QBDNIy&sPO5%sURJPkOZ_JZVKBRE22~9 zm_Et!O!6IT-nLrnVcaxFb-TI&JKXxouF*X!zNyGiz|)4g{nZG%!_%HMbI`Lp#~F53 z@w83IXrq&}fIq%SiS?`c&~mY_E6Zh$tyF+YdcLR<0aUNW~-})4DI>b-%T;h zf4u}#pIufgN^C#;9dYDWCABou8dxfnd)oM(Nc8iUrEyr&X_#8R5a(WlUBd|EI#ots zEsv~c#0gVmXr*n^SHd4BkbUbmu0np~FXmAYVdeo+_^L)@+2OX(MNH8a2!_Q+F-6sJ zX3XT>-OmZddUJNgphpPVQBtGidLZ9Oo3dRO>pMM%emZRhE)DzN4;S7e$qjFxE0!7m zG_-kpo@p{3-K$1NI06sw^Db*lrBzD48rAD%A%DsEQB{cGmko}5tMM#W52FFBUe;2d zI@9`_j=)M=YT4T5-T{=Nt7K)+A3q!KU#H7q*k~k}=3o>`KSAR)f{h7 z-u~DEA{X&3=~^y0>;^OF&$*&F*nU+A-qsvJ{T7L!&o+u8>ct)R`cf}hGw}{7I+KMz z$a0LUJ}cWwIl@#?dx;bBJyA}6y75X`wSBDy2E#m|MmWlw@O1Xj=7Gxi=BIcOD_`~Y<&KRi#^mX|KrZV?=?1{Mhq zu*b{IEg5n9TMvN}AEn4~)QRkI8f3D*%ERzafI3r|b9SD~SluyaC_&cak6!kK@8B2V zDZ|B6c=-^9%c_ab0pmRv|V2x-l4R5O0gX?@O*GYDkZ2p z+@nhdHtEjUCeBq@O`rFM#8?RS?9%)Y*D9`#a_f6?RX-@-vDLLr8OKLFV$67{8_RYa z3+38O3Zk~;Th0%4mF|+rZtp_AAfjP;(Hu+v9;rtuFUU)-;H0E6PRL`j_~x@5=rXC0 z#2{yw8D+?iKVE|Y`86dIR(GJur3^4~SKumqxzJ>D`j_UJ-(3*fED4R|JQuInYo;b> zAC!A$F{Y7sr00ZZU%^$mHK$NA6-+k7b7<7wSh8nx&EG0~EDvri+7u?i>X8#JHE8)R z+AMaD)U%GijAD~6b;Ov3#|M^=m)fjF+f4dxWJxoJ+JaaR81vOZlV#ARD>)H(8X5YT z^S@dq^je4kfG;ilhWJ-B%dY^hCF`0_uJcPP;e_C8(|Lw}g9@FQae)WwC^tJ*O|gO9 zv8i3U%~UGrFLo>mbInhnw#0a0^W0s7RYAlfLvk5LdJ>2X;QXK1MG-QyDxJ;(4GeXZ z-^am=^q0sy`?YiPqc>sJj>5rdvm=0b{xmOE#pB?~mnXd)Q@E`p` zp@$XFII-uyB|3_GmJ4?-D>ADtq}}cQ@i9~qx2e7WK(R^!+r_aY{QnORfx}IT^=#=EhANqnt1z-B8J1A==wxkMw)Fe1Rr+&bm*Bt?ch`_zuKq z?MRGkO}m7if5h$2-zhg-SpfiyMQfFwU3+tg7~$jLXKFExxR1^b#rWt%+_$p|O@UfG zf1Q3R#ad~LpDUC)en2;z^}%%mx?nY{>^M4?DJEui9Ytln>wGu2-GZYlfS=BBwWACh zGPK~%K?_63>z8fJd6Uapiw~q$*K*UJmH8aA7kW2SvNV?8DEpGpL@UtO;Noj6 zvCB|R`aZWXp*j#vD zp6+W$##IE)HEGjj1zm|;p1xOI!>+Yk!ToJ|k~g&o?6>W!Y?#qYK zLB$8g8on!ShO6Qz{f11Ryf~*!eLea&u+&%PJyf;il1Lc3 zmKcffmvSns^p1q`a;EMI!Z6;1TL2Qnsug$|++k>QJMibi);KldlL?kE`Lu^_(Sq;<@M zdMCFWwVeF>JDq{d&-FOX$o|rAmeEp6ANTTN3FjrRbe7)F60I@iZM!^_>*bx&noBu$k0Q*vIykyI9SeD+rsJdhGr|eORzI<>4 zfJPcPDVml~DKi}Uv!l)M7c5{U z@mj+IuUSP6`88Df6GvE8cu8$eJGf zP-%{4=kWHswuw8ViT{W0b?wsG+M1;N94nR;DG>S<{L4_=))^#nYmwNXA?e4uHscs^ zmbuL?B*Me1-ST+0T@AM=g39t`U$SHrW_U=Y)BAkZD8ptM=(n%H8Ap+aWNK~tvC=o5 zY>p*g0#P>#SFXN$#u&Q6Bl-&{5{;@D(A$#j4*@<9=a?I76zsK@DlPivOj5=Vb%GOZusPPnGXds*1&!P{xVy3OO&L!{(z-jI(29&yA z0A0+PHrFO>;tqDK2>grP zjh58THK7Ch3Ap=WjW;!RKRj>G=0yn-)@=J*V^F!_lNx^NfFUguu0#qOthb+!y|@V! zG8Yhy(kz0$K43-}AEO;6Mm++loGde0$>OaD$CyybG=yMn5gTTpPOomg5DU1p+GfE( z*&m#1i<2^#1=e26HD8S}BB%L^bsLSWMX-w8EY6H+jEEYuvi)8w2a`#{3ZLiX+xt3t z@K=tEYrOgs6BZXMdhf=XxPSi*7NMH$R%*h5V?p4mmi7nR^)~mD&KL)m`w9akI$OK6sPh>b;k?8QNbh+< zK6vk6G0bHe_Y~SGEyG=k!U*w7e@6*4=diSHDcU;IohHgb4aVbF508=}8r!#}MIu7> zFAvo}MlP4N#^qT*6lk-yK3G??^Mj>wIMZ}d;`G;)6M|}F%ft~4Eg$_(AaiwOY-OAg z;5Knh(tK~0Mut{$HcG}IYMa@JaJ~`2;y_nE%hFJ9W(l>_zv~)Ir%go%uG@7cfpGf5 z)B@k4ETIJ_RnSOJsEjJ>`50NO+>b4bhRc#u6Cpq!&;9n7J;`pl4xLumVBIFu;J-jd z#AS`KAQ4!`4@-v{bM9(i=?Jel;EQe8Pu51%EwDIz&VsUBQ8BIwHzBAr_`1;X%7veI zkxAYad@iQ>mAsX>X~`C`qkDoC?YjIU6NUBT{qiO4kSI!fkd`~yH5%gmw4PhdKJq+i zu_e}H9H4X3eqTMU{Ri3zWR2Uzrje@4%31i~3gF65_VG0Odp#(A+#d*<%h~>|_mv+n z4tZCFu`Ie81MtE!xPFD9-LvUMq(2%vpBQf8TXGQ9f1oC4npLVQo{ip(ks%9JMxrMW zUFcnKWJnaYQ_#BWgP~L0oNw>wNZL6*I{bnWCoEa*sw$iHw}&$8H_D=xxTs%Rw1?`V z>2Aj}H^r`h_6ujL@F6zphiQ;?O|IIKGRhj=e{#T2w1tJXpZO^!w_2=TuVq8*mK%m? zAGl55^hrOGH)s}Ze?QtrV*qWg@q~cUn@cn%5FQ__Oo$4FSy{FuSf5?)r2MhmnsKC8 z*hpH?CqZAP$dOR$Cx4JZ|4a8DD8e15jj?{x??UBIo+qt=U-a-{H_T((=w~r-Kq>;I zv%Q|U^8>9`F)nccI3vH>Cj=?h*8U`VbEH14(O@9alCswBN% zqUaAVRprNA(GaRBa6`jLd)gs=QJeu!9l6Z~!1t{*MW_y)t)+Tmv&bR&Mx>~%XB{bg z3b>CdriYuadvXl(Xs%-T_~VTc%*9sOkj>i#BzcC(HTyT^XaYO_}-+04sa#e zgq-eb_Ikap%H>|6=&f@`U3HtUgMP1Y24bJcw7%l~0~?GYH))sHkiB>k|3t$F5s^cUQZ=Pb{2$}`->xQY(Aq6F4`u)GdmVGQmit1eI}ph`!K8Hf@R*<4TafXGr&sqRKP-1>>dHw1aL}G40pr+gNDZ{UH8<@|-u^^NOfc5I zN$haq7knjpb+2{sqMrsNp{BGx{+-TMypSf|4!hinhsW2#3D29S;0Uh*Y1$M#&{Hzb zie4v7J6f_=Q0^0OGUf17{09ORKI?IHk5s+?8gFFsABgV@htHFj4^l@>xeX6I_p3B0 z-0YXhZPw2K-^$vmyZdcv6s!V8^-C_bMWpbmh|#>1KPq;U{=0bWyvS6zg#Rbd;bQ7q z3l%b`;CmU?OY+{G&>7-r)h2k*VDMPHyq{6cJ2a+(m3XP1n>>o2Mm1(;z;zS9+MoGo zj}Nor@39;NSojoYo(R`LfA6D%BHPTLev^ggpP<#A>wwxksBC9I=}f{Fk|yDE_)%5r zR84a_Z>Rp}hIBjoi$+uf>McaoZm#ZT!(Y0zNKNRJilauGEMn*-?J53%wz2)rOp{*E zq|+GmFKgxs720ZeE$xpJ(>=}GXcYmAUrkM~aZcMTQirrK>2TQI4S}|ZGnZusK`!X# ziFi`{BUaHYMVazi3cXwd|MGCMP$ZADLV@An_@+(`YYDItzPJVj%fVIxBfeiDe>D!1 z!U$gLQdqpZ4lFs~7EbG)Fg{CuvCTrxI6)NaKU|P1Z|<(&n!ePZqDB?TjKxQX0_kBo z_Ygs`^4*^oN7kCZ%4X*r8~avp5tCucvg`lMxA)U~zbE^kcO@$XW$aBjK>HGsREC;C z36{asj6BXudim$~5J_w(58SEKqhe9UfPN`!S0JS#>AHv4NBZv~?91{-{S_~?iB_Tx zBK_$`>MLW8vRfomzhXPz-?&)l57LeeVn$JZq|9WT(<|rH%{OFx_%2$6xAPG02~Vqx zL*|P&&}+LRYVD~)7E8-FA>_jnJ{2pNa7w0pZ;m64jW65=&mAJwPSPxv+5-8=|6bKJ zk{M|PW-j{*hw^OU$VSk1kPW>?#tQ@ef~mH3M*TCBo~)AQy+AE}$^=Qh;fFyD{q-hx_eNG>%2eAAt0w%CwEfIzdw-=&1$DQ1Rud^=mMl|FFQOTR)srR(9Es!J zpNHLN5f^0#0{OfXLb;|k)Zq{(%{mWZwDv&XYG+dM4*tCY#jOi&kj+}|h_^aPTpSSR zfIj0<e(`31pNQhnDq4g>$OC6jSx!w`cu2k!BN|qh6Dbs#WByb~)omji zeFVroi8FHEZ0Gm7sRG$iZmwB6g_rrJ@ytn^vFr*<%ON*EK^6~dXtx?yCZg9xeY-r+ z3p;N>r{uHjZ&jjLoW83FOZqeL{X-e#D1za9c~-}2;&CGP&PMG}heOUYki~CI48I@! zUL!#!Q?S$cm4{(W*$J0P=8J^%sbz5=##jrWBkxexvAVG7TS2_?x7V%?6MRa4Kh`so zN{sUu^-QTzj1WEy`_Z_gND`9$Q2f`-8bVw1Jmox&W^3o~wt`?t8nw2o8lCMHJI$7= zIK-yL4aJ|p@nnQxiZeqaoV52(RnQ3|D3B*sSH0$`M2s-d=7_OL(qFzCn+@chf3uW~ zZ}!}+ZtEb^U<+-RFAx&+cip(@H(a7KQK_RK2}|^vE|zu*Y4|eL!x^URG~eRTTT@T} zKC6l+>Ad#g&vrt&M1+BP?`FcT+9E@oc`WGbvoh-7O;SoX{|5@^VR_bS+{M8jrwsIe zi>w0WyX`S5EjhZ${2c1W-^htb!8x}^8g^BN2JI5>Zl73N!k)O*R8{r6FY^cGWhNU9 za`bc%qe+P)Pz*=-s!ovfeLO49Ip9cBx?VLs*Xez`u;i|=2}w4qT3K9LUF?F*C~~OX zq+T8-`s_)QW4Q6C>+2aTkmGh*@Q0IAuVgP#^NuSDAMp*@4SzVYPd;N79gj)5A#i~% zkj@F(C(VzbmQ!g@N>QO~dQ(2pJN|JDYVo#~9s>~#TPJK@_S2fl~JxC5!$aYp2VM}YQA~F4mhL3PBZCOcsZ0FiDDG|{9 zP5~gxsaE6g+PYBZVNCg$8vkYJi@-?fY!uGEG4=c+Tr|Nvah3-x!3s~r(4q`>vo1O`t`_0Y8x|SFa4$&o)J{0_P zF0>{1j6K|R=#j5}W2prig3yM}sOchkA_lOKNkSNa$l2o3l<)H0t9t)NbapHV2OD-oo?`x`R}+ItZV*Hr~4T6WP9!4&cj&^HuUU zFlA$X?@yx&-#p3Mtlc+;gqlUptL3oU6o!aT2@ZsifI3}-PwYjdvzgVL^?)d1Ihd`F zGD@OGYL_TsTj@T`X=pCP)tw*r`bQ?YhMY|PH_fo~hLjn?Fl0?2+dpf_fbV}G`^?%` zP|=2Pv#ONb+Ynpan~0O+6LbAfM?J1t0X-JhU9QPKKx^#&Tm(P02=n=S75YBjUH{rO zyzxYyk;|Hk!R~WV`y@0B_;gOU`rV@>YpR~o(kH74F|zUwH}=?XGW^|e0h1Nm?!6TSm~;f<3(w6 zyrN(%?s#w(UO#iO#Gq42j^eJniT4E9Wz+Q$7aPEUr!Qi?u1mn#KJE8n*wt$Cf-XOt zYD_zD$|ElXF}C6hag+9ec;LO1ve&$2TPJiV&+RWH?|#u+^-z6)Y6F*utC%oU5?#;3 z-j!C^WGqe$@yfY8_cL0f zw3PyO_D7L>iZuqvetR(dv1=I0mwWi3`FR0%UasI`Hq!8&UXHsx%`C!Z85L0qraMdkq%&UMp>D?_abEtFrpgsrRXD2ua6=pWn-nlI4{jplII7R)iqO@s4YS z2+N}99Jx;N#Jj5B7Fe`Sdvvt+S5T||j@<4=AEypvU1n$-R?OR13w%49(cRMI_E}8N zc}GFccUap5({Hm>g1z`Rhr>`#vE!zhURbA-xX0Fn}O)&LIwvHUQmd^|f0(;uO{g7q!XY?5zE;igY69JbhO!GcU)D?T}Lk0#7!j&XzOle%c@s) zFOVlO#O6=h5~3^1P_|A=YNFxgo37}-?h5bWsF`~icYd6(rLka^AHOE`R*SkHL}a5Z zHMOL|t@a-%mqirnqRZ}SYF+xMP-pLv%qKa=;H723yJnqt2P^{n{u_$%o0kG}rwyX@ zpETa_^k|-Eg{rEGkPW>!&E7~PhOg2jhFy?q$Uk|&Q4{YMLJ#80SeVLul2;cUDR#uB zg2sP0Of;<>FS^P9f*9%K%I)9!&3Q*Bc1L;=9y&5RU*l>#ZyVIx6YA((LJ--t@FcW` zOSMvmn9^(n_L8=aJ6n;z_OQY{!lTDx-gW0?K1) z@SE+bOHy3I0&(ZsaM{)zkc&3XR);r|lHy4*N zekAcJ>`uoKmc2Ir#nf;Yvi3A9$(HIhrtH!I6OorFo^tp z|Hw`}fTH~cYi*nphXigL7m`^-A2~;Cn&w2KVUSYe`yC>~KG_v|{&1Gpe1cRP1orZ! zz>qL`NvGm+L-DB77n~o>_b5C{Y%^eCR@k7p7xcMRF{LD$tg8iobNTTTA7%12Yq;YgprduLz z4steFOQ4?PqV~&v1!{eT-Y;Zfz0)B9T{bxEf8@J-QjdS@Uv@dm9HzltRyJQ^C#~T| zesk+gXtSq4#wREd^id~!wqcn!MPfi!{;?r7?@_8ocSw`p?^l+3be%k1JP+{u%#~^C z&digwCqDU>YambAhT;&BZy$p4gEG^WMm%B&!p9=mgG-?|x04VwV-d&kasRB$O-+ND zD1G-Ubv26B!l$$UKmk|*b2`{!2cFCRpG4gU-M%dOB|Kiz-t-iq=4TWEJ(>J(`CE-v zy@lDIPki85mPfH!MZTRS78LsrpZ(vxs5H`Q#G)1uBMo-*`|aDmRDN>gdcxrT#9C@H zb^MwV(=}F;G6m=(3RFS~Yin!|V+o5Rmvm?RUiv{BSR9B%y|!X4c8krvf zooaZcovECYelT?pWHQrFk3tl=pD_9ZjRV|GI@;V=2I$Z9coI&qoUd#0)FxQrE+CSc zS4=-nI+7C5eaovP9qnd_{{wNqgg-U@e3X4p!=z3h??0gOGmL6gUTeF_EDQK zApaLU@7?BHqrk1R6MxJP{=<;x$e|BTQiuD;0Q;HQi&~uJxiCt<91VM7akSRh-(i0G z2kDFKrH6-Cb8()0%Xz7I-WTOBoVPIP6%d|&#av2rrElml?moGx;;3`iKqI5|PYUFE ztCbW&M^vhM`T0J?{No+$;Vojt7Z41+k%JU_4!GvzWX|I(Scft zYQCC-(zhizYDNHqCX*gwUhd#E#9H_qPQD9sgB#5xoXH~sLx0@E9v-WihnERR@FbgR zr*z1wQHjT>-vZ9S=R7e&8(q{O$HJ&Iy%MNj*ZmBic+#@Ik<3wSk{CN)UPci=vsrsi zxSKEfp1Zo}JU5_eqp6akvH2PM%;Y1=)Q)chSL*6~_&<kS1vPLj}HsEazywK+9uP(~q+u#mAjg02B4b;^k$Ztih)I zsYp=A>O@62^fFyDb5@Pu5ajOC;B~hy0~NQ5w|`lAco zbx`geh@uSW=|0ILamVTxc*ShkcE$JZ$<_(F^|qM126?wEAv0?Hcs53yJ|Xz{J!d5K z5~e$R{M}vILVb_@`0%~;d5wy=d_^UnNT}H|(ZAYDIRActO3?8{7eJ4D8Uk9qk|K7# zVyAAUEdk_zAmaUbYC%AuM_&Xbu*2;kED3!5XqVP6KK--Q%Gx2F@jP(<^I8)3S5^Kc zw2l;`HuIY94uivvJV=10Y4j>IQ%HB-7v@*Z4ZacK0m@{4psM zO2KVKnH|rg4xw(Xak*{YWBPk^2%z6SFWr$(k3nhZx5>wiUrmkfSpmo{psx}Cwa}vq zXC!1h7;^idEuls~{pUXrQfL>oILsy?v*RdZ*_M`(t;KS!{zntWG2&<*9Au;SA85;# z&4cBLKj98j|6vLEDtTC~U?W`y+Ztm)vWZ5Y#PBK1E$f&HEm7Wy?a!G}Flf<3KBqvA zU0aJWMdu*#;=YPl5MRpG;moun zPqEohLF+XC&~EDYga;dY@4n7GFF@rAl*}yFamPQsRs>}=sKlN_<|vZkn(cKhhBg@n z0*n!+iF|XBS9npjWXDSOXcJ8+o`;pJn3UWWu-oqp<*okkK;@F5( zA=6p_9g(0B67U%s`I{q~`qwaaWtm@}8!y1j^s0ln{j4OK+Zu zvlF-C@x{9Mic}ekY2>N|_fjy1{B&LJ!e7@lJ>yPm4GekbD`sfJc(Z4h!UUIh#~nx> zIQuNl61|>CU*{%Ak}M~OL{O_4%`wL?q~l{3xlPU!6%JIh2baiTViO3HUsAb$l;m1V zI9m227K9dC9%c^Q7w3hI#$_W&V|;aSqVB@} zJVfvE$IKx=#G3!z3C7w5$7i7gI!f&7SH~H6$TC8f(uak~;Y##JDsg)Hv!odDGG*%N zB0Yu4aPef@*Ey*bz_XaEd=>W3HFi43{c-OzoD8lW?XqUgxH%UrUbrze)NF`>I^jb+ z^mSR!oI~c~w}n2xn7mwm@~wzGR7%uAJP5P%3A)8l z77HEgg=ChaV1M(+Eujkxmo?}pv-U`^q#bZZG!;nYM3yAM)-uSRVdI1fi(pnU<(h6Y z(vL2G2v3tHzg`ec+jo9)@8NCW{g&J&k@sVh$BHBWnl3$N&T6;BS(Nf?`D@MeX31)`l?9k z-Sij!)Qd2tGp6Kh-BiuYR`aCn;5&9d`DJ)kk{(zdE`V>5?M&l{+pj;HegyY2E^~jp z0vg`7&GfRacB6j|`ehlU>Ug=x(rL0TBj!^rLFSOvio_H~9s6O5AvUM@-|xmC4K9a0<$4#a!6TpLZ{ z@97w~>e(-8*L8@so2d2SkC@??&)9uCr5QPv0BTHj~>F}50U@m2}~EClm4)l4!IxzMW#jF#Glt`?1h0hMxIsHk18pnD~AJniEee zF#!tw$p1!wBY96l257mXCU(N446Te1zsKL-SKWL0_;H_MUzf1X($?aWeE!G(Ku2jR z3DoT~qC=(D9GS)uscsI6V@}Zf9l*Trbh-E`TRls((P?@alIj z^$-!@2FKh3(WHI>{GXpto|EJGp4gX{ZOq`OVjUDLPas=Dgpc@A!~WIkwFJObeaazW z3w0@!@QK4zc|AqwH4(Kqb$@mjre2ay_bVB{QDL}&Lu#mMpkABdR_5H03`cEUnfOJC z{?CGU5F^dE?MSXS>BORW-%sCtcH;>frn{uJWonOY@?;ro`u-xKK-s58h&Z;e5ohxc zmz{o%SqE~9rJ?4TFcH_ZG+jA7pK4Y(_d`6TO{TK9}WM+EtOedSSXtjfH3nPAYAA&E75C7&|-p87I z^a@c5?p<}M&AHWPrekgrBuqqsf_8qI ztVDbmdma2)fp`|+5lb)COqR*=Dq@3EZ4?8jx+-fMQ!@6OJagn?sHnwNF=7VApK&?? znx@UV-dB2u>8^s+dMJnY4o^iagk|{Ae)Sh9)<@N=m%QB!`j&Lf#*l7)iWZF|;d%P* z&!}BwUQHF`-|qS2q=Rz1d?B}z-#^xvkxc>m%W{#Vk=s%1j%urE_P4qjW_Q}T=ps%} zQC-3|nTzq9NA3xC_s(Na#-9U5Hd{kP&W{_zE`dc^sdKO++u@_Lf$d6VcbDYe?M@hL z;R<(F*Cc7v%^q{unT*>YP~|w{%b5r8@S!~lwXY#NLx9(1X&)F2JX@YR$bAXl(6U%P zFUBI5nv`ZJzr3kzcl_6N!9y5hOQzxG;ztZGEeV1t8tICJ6yJu0J>}X!j)BEmUmC}4 zy!-U*kDu8dG{SRpG4DTx z8bM#Z7!!fzwyaRW8>H=EzEJ7g{t#VK^;(2liBs#TK+z$|;v4aB9MiJZUBmL)^Gy)? zd>g3}c9(|6-Y@DIZ@Q5&StROV_g_t^mh)vQO*C6%IRj_DwlG&!DHtP^=W!UwN1uwG z?$>K=Rt_n7(I4Dv(fSFgj}rCKo8g13+BS%s^^Z@ddx{_3`{B!lWw2h zZ2`t=Ity(T+)S~tN~_mXqD4-QHC7j$b;`K=OdI-!7$!Mb*Arsw$r)+R=GE_+RH7YE zB&V`wRTK^g48%`MI*bCVV+{HZ5ZkHRI4}EBQYZOVJLHD!8MK`*cW6T7_gHyTL?Sw8 zR0@s%uM~Wd_{#i8kdd4F!#Mt~!IbUda$V8i1*UiXViv8jyianfY=+II6dz)>KAuIg zxu}gpO6;KnH0GRXO_~$nT(9~@Stj^W{hwg}z{P-k_Y6lNV+4g7N<|h(hSh3rZa?C_ zu$8y{4^;Z2`?g{ci90|sagzOZ`Nmb2M5A!>y+XuIXhbmiIy%n9h0afxpj16w@oD>R z0zG48rsBM1MXF?xXv$ZLMG?{{j~F5(q$Z-hPK{sm*4G+{z)GpJ<(9+jC^Y* zlRk#?Od5Tz!|_x4jFGi4h<3E%3+}@kIucvc9?7;8pntIVO{p7;gQsnQB4&)o&&ah} z4y^w8&GEGdjpp1cJZSyyf1vIu=-KF=xT5&KezQ7>QS#bXLJz{4Z;ayyxK8-ap_1oGsxLh3n@9VLS%2fLyvwG9bV8uocekqiOF%_boY8;S#|&hPe^SYXvQ z_@RNz;vun219wzy>bqfl4y->nnq2bJCBG=EH=5CJtd30mt$|r9&Qo;xh5&AF@5t8A zx!n_D$woOwNxcv(P8?2W9h=mf|AA8Yx@jJ)hHvcsA1M9$|B0_9Eh=tw-g~dZ&4Za+ zfCD0}+g3b%aUCd@=Q;@(&YpFuu5&AP(~yw1V=6WPK7_&mK)Fn}%|JHxtB^f!_90m(b+a%BJyh;t#!H-?a z*LT_yM%Evd9V^WB$@{LsX0$u-i(=E|Qk%@;l_GB*A8#$atxqF6WQ1Sg#?>qgXU}pR zVSvJPxC6M4{vC5hNf>8#My*%E$)AW5)5~qi@oMxWjuF^6~aX5f&Ph>O* zYOvL3ZnpUb<&k1=0h2K=otKW*s657-y}0^10vOJv;#GgY{iTMIg$umu_E}WYE1peT z0$47&+G`sFbIRBgIc!AGi?s{m!yNYPGj5^Z&xFtKgP2lu-mC8N3P^n#c}m&<HSzYT1Z7q@nFm~7a8plF4kc(xCChkucM(~ILxaQ z#AQnS5Z(aL@hRDtc49Sff_`;seq8gVr`M2S`l;RoQGsx0enZ>?lF5HB8 zqzOx~zl9yXdui{eu9PE<kdpIZ3xteacQ_Zw7y!G z>XpOh(>Xg||KjmvLv#9+I4esGqBEmlJ#s_5_4{qSkJT1;o4BObp!>6z&f5PLY1+{M z+9pwU1PI3Vq`t0v%C@z11(f-={}dfg@w082%)W@qXlUezJ4fQe>RkMEi(1ulz}tGO zETj8nx(R=|8TMujrAvGtgWmls%4-UuLuR|leds)!kMF9~RPJb=HRaux*}3LHWZ-6v z=ibbX>&y_V(MEA`YUt~L(?}CVhRDR;-4lgD5~^)(Kcbb6`rpA*PzN`~qj+;uyP2y; zw0D?x&|5S>=tw9d?Inzwm^q7wPBEhl*=whqEIS*MZTr$+d-LFMf%Hxo){#d8^XY0mOMz`?rsZ+yks&jirqCnC2VG?dE(-IT@3N06{!v6RBk_`uv*%e7uN z-SklT$BEO#<3|Ql$o#0J^)o3sa}GSI0N2w&@53pA=UTIJ{9}2dzTA&-f@$H|2>z5o zNirPe+XVT~|A7RK%-1(${yMK1exS}w^yFR67zico?3Syx71 z37eHR%a;aFVDQ6`-@7ST@F=GsK~MS=dg#R9;f zi=8*a09=jntIJpzIR-&=Z{u+97~m0J1(S=dXL(rB#z|^8`996gR+q#SO?d3QAX}m3 z{iLqT`%K7bXgM~igZ#0QSH=5-8RDt2WR3RjAtB*^6rFc8oLv{iM+hNG2%?XKs3Cf1 zi0Hld5WRPzPY}I~-ol9Jo#?#;qxarh^xoUd`#s-U{<5&l%yaKO_w0Rsd$vtHI-xwF z@}lY*tBAMr&RJi7aTW1Czc&AdY*AJ%QdmG;f{w1j<={C(Xt~*Yk2ZYCAG7Xr^jj~# zk?&3gYqb4KfIGeeYm+o=?3p&q{C?F}eEXAyb98EKwwdzh;XFOIlbM_Av(xxl@m~Zd z6#?rO;gs0Vab}EWp`F*8~NMOC)Z~Rr`e7+>st(>d8!$v-c_5k%s>83rW5P}>(5V;NHHZ99qx<7OzG=(V?I5wGQTv^8d zRi=jRrV6057A^EEP!>T?tCb!dDj^+F!E;^}F@De2bLP4;7*Q`b#!$g>0N9=&$OqcZ z`a6Ka5Avj>)H=8$BYe~HCCC~WQz)q{S~jRFEzJD+^F^*Fwxs~bH$fb%e*oDqzN15h zD7~5Y4+5hY@@meEe_S0lR@#e*<}Vq2UWnB_+SG}DD1I5|eIS@W_!!2;snlER6I!5H zG@238$s`nHVM*m1^x}rs=p=q6!XA#A89!KkeYRTp?WSBsy1Jzi=k-Vih82s@Gnamv zYXua^Z4jB;h67XPE=u(E<-Ssnjj$ueL;hS2+OrJQ1Iprylb-7v``kO z#YM^7Yu}`AK=Ah8K*~WjMAQ#x3^pOj4ndmvw8CFmr+1W~vyj^!0% zeesn3jkfaHX@`xtUzj7Cv3WQhpXK?t1H_F+TKuPD}->QM_uXd^^jk?!2Fz~_Q+Cl&n686L&)^mnl$P|Wn1Nqow-D#P-Kex=I`aU0S z(XY6PcR>or|H1{(>EPcro3-HaP-}L~od61U?BaIqQ-R+uA+^IP{lbF z(y-rgeEZsT=qUfGC+3Wli2N)*&(Q8gY*L2B^PZBwWcF6ngV9LlqGcU&Mi$V%#*&M* z#2!786XF7O{FBbrsrlTuv00P8|TBc0! zPPo53e-!`T&R%DKT}$1uQ*zt%iR}PV$(#SB(4eE1xz{F4AIOtSuZ1pCzHe{h7Z% zMZ1H>IlOXX(~!*0tuFGt_*hjt?LY2_8_z_na=2xo=Uc|2&$!2T+N18M8qcVku*zUS z@k(*{7hr`$=~9WVWIQ2b#Mj$6;@m3Kw#sHWz2ELm?*9YrW|dT8%{kps%qMI}j-Fxy zlj*u!pTy2BHED6L1f5wwO5V3>REW9N<*FUu));Wj>&YL}r&I}dteSpL1TxhM+Q}a9 zPAm;=`8Z{6I;w@j-xCTalSQO=nmD`49>(DVo>YTRFvkSMt7ut%GxUxCfr9dwjQ#|+ zGL}7%HeqzM`|e^vq`+p3Sqv%97ZPAzOh%kKI@4!jY~31tHHn!ma5ip`AA@rCYMr1{ zd+|GAK-S^&CH@3>Z;bm3G_9_yg7#OwnYR%GTwD*ecK6M*`=NqwWw&DtabJ2f_ ztLpv({Zy5@PUpUJL$c=5#Wv-Ge~_cgkSAL(wVMW!ocCjqlV7a|e9Bl6D3&cS+vyy& zMhB}y_J_H=KyFthsb>DYwZ^M-*C}rS3S2-P@BRw(E&5$Q(kAe8MpnixAoop7fRQOl zKDhg*Y!0Um!*5i}suS>Msk{1VZ)h)GY-?(3^VPpajS#BuvJW2(uW6ggJt-N|#X@jw zsC+fv6W05)zEq_@;M%P*yC^>*bq3KVM&s-|rs``(wDpua-S12n^v>^urJ&Hr5Pk zwSVfWe*Cq;>Hd*o?<#jqf1#qRq@d1qu80^09m11o-5ScXXXnJRH6KR9;)*e`gAz z(0&S=Edb`(SolEyfnGiB|B;1(jeT}`0f{i8cKJ#G$(m2M*krIXTJG%Y9gVePYtbZY zzjk;mE>edQzLACYwcvf4e0iwyZbP>~vXm~_+ycVNOcg{RY3NPfJ|%NonTGoG7RlPO z)F-qRnO~J>VPHdAW&Cm{;bikzwT}UA>G?wTy^IMLmV^#Cnj#&st0sUj9*$I$;Vt9y zh!8p>HajCR0Aw)@id}H4pWD=}i)O}8$C=$d=lT6T7B*R{qr+I-BhmJ4x+hx&Vaih7 zim$JR^Gf6szGH*A1U&Zl2AS-1+gEOm_%q*LxWV~O##9V%OP|X!9(d4{BD7Ci6ZH6Z zLeG$n%(CvYOC}LcEF5{5G84%^SpW|6@c2F<1OH*Y|{{sED-t z_YPksbBzdxS}to#60GB{(jqwfH^(}yR(Nbs^;p<@<=s1i`3)ehJ_Z;7AW$Lj`DI=h*rdbo# zSf4olS~KOa>8-losQVtnX{iCX9Pu_xEw=T{rkw<1k2GwWf9f=2_9fzO=G}{>z^OV@ zuiEUR`L-SKK&c1N(eK~vTQna zlunp`%kA}Tsa(tTv!stcWFEWcC4`Ba0q(-tcUY*uPHIbkZ<4?h{Uy@h%y}D-$z?vuxp6*=UMdp_*LY}-<>H`h{@i_-} zR@};^ax;W47!r0sa8-PyHksc_1BKH@jbI_IQuy5wU)lsp?I!=wPd}B5FOd=V)JUNV zCgSbLwxnXm>P+uGE<4+OmC~bgNu_Bb*==^>81&ir^>E1&dBq+7j^wbBV77HjDTO!I z+I#J7c#$T(-yddrcqf6Od7NOeZ;ZXo-Y$xfZ)+NOTo4q^`Rj9ZdEmROB{Q&hhZgVD zvJs`H+KoZeAFdHxlOHtqw24PeV$+{hTn`@Aku0o~;U{J`@AN)lF23v;Xep%Sz@pj` zxGtV|(Zs^YeIt~R7?b)k8jw4>2@bX0fz#=Ai%9mpV=%yjA;Eg;@raL21dhzaxX4rm zpdYZ3TDeHK=koNa#zL&nI{i3vI_i2eEjI`c0D<@Fy{iNuBgHz??gdQt>!>;*CR)F> z5KbD4^Bk2dTk*q}R@W7Cio&%~Sk%XFA@_K8ad*@BAC?mMIKbr|%>*MG$IN{kv#$vM z0|m^+<}2jb_*;u)nr6jvh%z@)j}gDHIh~{aW0StSHkn5UPa~c+q%!?(ZzHnB7->g! zTS$nYwuuqPWn8-~;56IM{6>6pT~KvRj1{*G7eZ-fNeRS)4j}qAWA$zsAe;R@o4m_` zLXQ2pvw}Fc*}#}R-<`O`*n&)*>tiK^JO+b{tapAdwG#R?mddUI$1oSP(d}L}_q#8S zH+e*uL!K&K+=Mi3){DnfotLn@G5r+8zr-cX8uwQ3hC_HNFm%L;s>^q{&9o}9x+W2o zxAcHV&o0Ka4ZpcnA~rQW7k)bsA58NpIHof(L9YAqusQuui}YZ|NxgpzyqJYs`r>Qr zFIv*2IdZyepT=CQLeYcfh;$krNo43)^iez*W|qCLCG?C{p*NBs?Bf8~b7dZVDukhi z>iTr9oQT|8P)GfH{P_96K?B(*9i*w?L3+*?~9y7HN9MJQ$E2;!J zNWNHqumkL*38iHr%AKkCtBEBVEl~F%@_5eh{BlVe$^bnlssA;rUE4T)yo8STGWd=d zf%;){^{lymfuxCycE-p}@lk8h@TIU_Lxg$MK%;BXw^x$ptY4EVsi1^iSQ+Ux*?u$k zMw0i@U6QX{m9gk}7*04p&?T@6m}VFY>27Ix3ptr^7@UjDq`w{s`aH_dY&@(b@bT!& z*~0r}Hs=zm-bTl+(HGZLG|4$&M(X0roS$ZqfrG+)JH*p0x%=Mjj5J0NO#Fuw3Pfzn+|4!CE6YfHVSfBv{AN+(m~4S| zY%|$;;elJ;X;mZ@YclB9>!uJ^A{7l;03>HtDS@r(r5;dAB>UKyZ;E!WL!Ku%*3m{Q zE+LXq5C<9%K{5%_Wlnl-PrbHI-KE;4N%~bUJW1q#cbiY|uQD62Fzr))ApTUkw-%&F z^Q?9qyy1mV~GK{_$R!}zm((tz5cU(s7?8w}oerSiE{)!Um}j4kx=cHnu@Zs&A~ zCP=@FPJJlxBwS`5e!}zQ$<_*et3f=iHRNCzM*7$ZWk20)AtzA8e>afd zAcyYV!dVy4bDrQ&bA5u7qtN|UVC%4%u*B$CqKKy&hCC;(KFA0LXLvr9VAuM4G7Sf@ zi7B;xS{8%q9whc|k~k$Q*2Up_H6u_1;?#WUAK?du&jU8Ded~IGT~l~{0-3VZ3UO$*vV>9SE;QHnVQF2 zklBtP%ERU=OaC}%wJp!3%=K%orzg8+$(eX3IsG+nwpdoB!Dq^&S#JC=haubm8`VT9 z!`6)UJQ;3+$8~53-NCorGQ<^0d`AzCXAA|yvP*V76Z-PDi_UTFDUlL=_@YIvf$)H* zpjb9bh6CTb>)LE1K(DsV zb(8sD1}oDJjcyQ6T3jcQft$m6W;8BM=J+)R;h|5J06%5Nswy;JzIpZciV@^AP_IFI zai%2Hfs-C%i*vacWuo~?sa*E)&EE!Ln95a=m{Sfr)}iz!?`TaC=Z?7G9x=f`_3m!y z>PM``G9=%ULECFH$prM*M_+lT4ePnTtEEwWyDF`=dAL${G~(oh%Pc0O6uofLLyf~I z9lW-m%O1SY0JI^k#%rV|F3;earpCi&Znom=b{#+X>vu!S1f|ACDyceg;q#ycazsuE zzfI}la~pRXUH(sreb91>=sAj;-_mk0@QJ3C{xtUEh6{40*G%SHiEJ<3+3K&c0e}WZ z?`tUmZz~y1X|DM7r+~~v+Rd0RU3PR55Z?&ULuAl}4(6(Edh%9d zQYcp3CrJ%Sn~J}*bf1%g=iYEY0g^w3XZ6hsOCtfEV;5Eh$C`p|bzjyv>a^vaE=Qfae$NjhIPtySCysJw=VQXC-ciM(0WlRP1dRtJC7kZm!Pcf|fM?79t?6SZkhE`Um^@x`zLOOqWTM|6Q8I%EEQI))>~oRIy%+Sdl_F z{~ASN$_$2X}%^)~!ha9mrAkfo<0CH2NF{x;ClZ-5N@qVxJm+35&;(l+D&*$EKdvJS7GC4}7N`lNxc#MjMOS z5abd49Csu5l`wUgSh9?2EDDc6vDu&DE}g=So=}=0Wtmg`=L9xwTct;F$8 z+}H165~|s+DMD(ho}|5ZD+Rjf)?+v3vMNS35K&RNt0Gv$4&A?+XlQHC+&lQ&$>pya zs)x1lg@znh<8jF!gnEBmzIYq^pa+wk?RH&D8S6{Q{pUMBH(jwaoiCTyX-@g6sPkD~ zi^D2~c>t}uNyD6$#Tfb& zp$w*fQ8o=Af|2K+7uzD)cMQhcI~L|J0s@Ta=O;TPD-wIz*IawCX4RqjmIoP04`s3m z((&Q*e@bF^*Pd?6xJz~28IE0DQmV3Krjn2>U!g=#n=da!%d7y@1Jg8{V`wAvuFxFJ z7qCEvctYEEAJN`Y`0JEazbh4zoFaFZ3lsh3F7$Qr}1J!00K*lw` zCO2B9TaY-d<)8L7N}@HZcJ$RgC)B&2%W~A3Usy~6`~@kI3y}aTRUXAm@7L@DD+Bx! zN530)W^1pEMjdCMt@iAk_eZ_x29y1RL#}@X`m3|S@L}~9@W=RZ+l-OEeB0SRfemSs z9(GrkadTjniA9($2IngN*6O>jd*Tzy1BT4E1$ji?hjP8B$^;IxSnax6xK+qCo}9x+ zvC#%qf{a=56Jov{-N7&mOeu`O;Na->3FjK>ytRP>a{3s;;auD@2zwU6-E3X}3$5Rx z7euZa0OV!tfK@}5vr_4((dv?*M|Ik}#^VmU<*Vg3ww?lL$m5>(Sd{ynd) zA4aa;*}QE~fbyoi=|r9wQ28zC&~FJ~7Ach3T=Hpeyx0?~DrUqbI5W_cdXrf%n0!Kfcn zoFYma5tQZubQ4(}&8ZWdPr>Rf_{MbgKYL4ohTM%5IIHYp8-0EqEj!<2Pf*uG3i8(p z`#;b?IFN|*Z^k{9GEuG8{+6h?^g(lcS=a8HXPIT};skEr`;VQ;^lx2eg8C5XB0iQO zMXwjDgO1rRILZ65+U#UDWiP|(or>asE-ItTCLXCGi*1U5`2KDYs#O!+aQp(Y=~ReR znuNwsK5vcP_tUV(;!6ZOY&|h0_VTTxPI~A612q76EF56yB~)l9;y;jtzX)L00e%6z zl<~&+*dJJ(&vF5)vtV#)|4dEts)M>7fKckC^Bmw$xkq_eu0(&caf!oFq_WDP-PZPq zS;?BsDm7YEPF2%4_;%px{(NPS|P!ZTw((ZL` zdIX{$fN^eotkvjELQuDMLh^ZA&0hR--$djL-+>?SoB?6CS&+(h(HodX0ILC-0C+J& zcI#0dAsV)*0U3?8T4vkUyNfDODASKvq>rHM)RfHhP4JoX-jKc&Va^5mUcdaPVAj(* z8EXTW`DQM5W*>C8!iPgl;|)X9$?CBjIqzWlSH|c~Vt5n4L6}Vzw*5nV-Js{hhMtxcf(2Du zIc2$H~l0WgrQlxqdCNi)B#{Rw>I_j)3)E_i4)O&XwbrHRPp@p&!} z#9<58ClMab*#67<*LGcExTu);Y0V?`VK>e{<_)HzjF01UVL@uFcAFPh``5oPGu^3+ zc!)%qIr~7ro~sAcu@FX6gk?@8H-W>5(FNH!vg;0B&b@I$%wavuG&xT8dnbTgIcu*4 zNg~+m@@)VYqeGD`X?+8xRx%yjBD|T$20#t-<8GU~ca;sb`6@KJUf4cB8G%n0c+ygH z+4}lw$2OK?Bs?g~*=Y8d)sHEvoMoi3LJ_9YGUe8Q6;mpMxb6?%fwFw>Gg`(u(1llp zL|qIqjfaB>*f$A0n*=;8kPDKja4`V$eJID*YgRB|v7YI(`+aZOgHnak{ophxe|@mLc1nqVRJ3mrDwMDBsai?HF1B9c25 zx_p>6GaUbUaxlwwl?CaG@xfn}v2UmSqq5Nmbtr+9t7q#NN$LfWZC=a@(0@%CFx7)7 zXJ@(DmG1S{1Gf#m#61R}9uZ1dQkyETD8G)VdRvvd8_JN@z9h70vGpF{u8C&}xv-p%4^> zQFu2_RlnyxVQlTP#&%${;iwH^GbdzXY0V^1ZfoLoze`x~F&JFArv)bGg7wE+>?i^N zsRP1{;sGMEjox<3*0Bm2wQGLPBCFp2jVBs5O-spk0eINeiJ6x7{;8eX= zq5fqRowaC;iOd!rmU18+Y_WEgFNp=|KH-SW4Oc#hwb;dtDguinGypE3DCyzznd;h0Mzp%Wk%+eqRO<+y9an?Ua3)Eo~K!~2DH|F=P}i}p@Iq; zub|psK&@eyt2$l#s2MgCJ=U18!1&Ju>rlTuj?3=H1bc3F52?EN!MO}qOsBK5w6pJK zOCJxzQZ<(uWg!?Rr^W{u*ytG=bI;;{+?h9o zZxOay8t|mx!VP%>jd%t1uwS%D*8PvcEN?o6pkG4|QRkIEHP^4fA^xmqP}FBOVRUlf zqLM>#lmoSZ#1BR6dD`4jq=;Z)AjkcEHRV;X;!mv8>kWq2FRE(-#Ans-^n$oWa2v;m z3&~Tyxk7>7wTfCtLv^^w#nVf6S@fBgdS8fu65aQ zlwR5yh6CI`#_rA`FHug9LH$n)r?ay60JYau86~i^B0NTg?%9Fsi~F2Rfpo5t?1F?k zC2j1lL=?{hC;5X#_98E#w;kKVykxTE`{jxTyzzSS@cBkspG^37?J0l;|7lKo(t$zl z*!|IqUYR7NcHIhOY#uDO(6 z>-8%6U&i0ciEvtB6elGtNLE&>#Up0R>&hE`V*Do2Zuk^WvSk{FrWU)5FB)QS7t!*b z@hNg-&ak{zGP5RQ!fni_@BDR~iQ!gpQQQPxO%msyOulQx4i|)F^6aR4s#|UOPi>IE z7j^E0`2nOIwZXQ=8a=ECsFU4k$W%pyP4m6@4qRZsuBv3;m0Y&bK{&srQvRC07k5JT z)u+d#toZL}7*Om1dgf6ew^DC5gDoU;LXK$oGx;m}#Fjkr^&@Tik5n$>M3^j(?vM>d z^7P6k1KnvFg{vo)n9P{hdGXcSluh6h{yQxgQNw^E{77YAljM7NgCTt(O=GB}DmC61 zmNeb?Z;-?CNzcRfML?^Tuc-Wub(#BrAOXtLI{8#bVi)3%LGybrcQ_zxjCBTQe*%9k zK2|`vY=57U8RK%%V^>ji4z>)pA2O{XhtJW?lxUq5qoyi-CKxM4 zg=QgEcRB&mp1;d`?Nt&}cVUVypbxB|HX6*)Fo(%gKZ~B6Z_1x|o27wvpU1oNW zDPN`MfIvn0sEni@sSgI!OIU=U)Asx#kbWI-Uq1jionG^YJu zu405}eY9A59MGeXMtpFVW1LIW(6{5q-c(o;u7e#hKx_2nF>!{g@(TE_m#LD)ie&Qn zy8sxW^E`?doDkXO@mtSO_kc7ZUEX+Px4*01+>c3HGM4X1U1)u3FJwAZyeZ>SV(OH= zKD~m?G({=*Wm6ny=R=~(bbZvz1aU;tO3h+kU68PW0NXqIJi-rh@D@!It1}W~J$oA+ zD^xo840xCI(%^66f6qANYul%jP-0OAa~KBHdg*Wm36t<)qau&V$(kI|iJ zhakL>odQhpv0(xYl`|V)LH|hGzkwptZHzVfVqV5*?|>=w_oYl9ac@d5h+$l)*&mI{fQGpnDe7%c#iVWkB})1b$yDgX8n+KgQvSa#NewyO5 z+w`$-RsN|DMt<<>J}}7AHs;c!5x}2MYGP@{jpL3^5SqRErnayj*MA`!|G^q0W!Wdb z_lB_}-;L(|;K8@IjlwO+=N^1meA?UpfyRjcZ*t|iCW%|}x9#5C{m!VsLGoQlG@)yG_yJtG!T^k%_ZWnVv zCworrl=PaS+8#YRYc1uu!j?u<7G$3hHKfNqc!Bv%P*7DYhzI?uSMp=^oHa%T%&96F zgUDHSV4yUbpTqJ#d{0GxaFV^eT!bez)h& z&FgEPbRKkZ9JDcvZQl%Km!a2p6H9`d(c`RWWb}?sk9(8m>+Cyy{z~YDj@Fxj^P5j@ zzG6`Usr8Cx{Hi=}509-eiKg z@l$o=quyKl;%MkkHd?MWt<&Mo+>3z#6h$OgJEdE&AaeD&@k%eVrsvnjYEbkpts5ME zEe0=cR%8i|?Er#NV%LaQaXn-K;2&^puPbag&GckNN-0dlWZ>&_qKdw zGwsQ!pdOwQQ}}A)oz;4?RDP^vKwAr_|Jl}djm@6PIEAm$Ftu}_kLOdt$qWq*F8u70sU3m zBfO}ju?iN8CdIN;4m=B<(<-i$kbjpMw1kmKlsb=V&}>ER-xAnl96-0%FEXF4I90W_ z8J~E`JD4)y%mkBrDGr#X9gp;vh;X5DS!yi`)O+JXYqIVtvu{|dCgD$EY$!>oB!q1k zKVCHkR@`jfG3F#EIDaO1TOla}y-QlmmYvq{eKtQawGkJgyg=)jMT41_Vt`C+Ea0-5N)4&h^y zV?_r^OLX@4ep%Kvsd?oS@O@LbL*>F zU3uRf@mZxB-SycqhRal&iVc;Vb7WEJ92vDhp%KH-VK5R|-t`~IoM2zE!RadP(eH1D z`m=5Y#%}@8#nNYT1bS3R-5DuHPY6o}m+z(G2g%Bf+MV=v%ZQ2T2DLEo6i*_-YMk(E z<=N0iQZ{t3mwhh(7nAh%gq z>T2NCYxIlU>M?!ENL9DkD^7y`QSU+%vqF7w0fr>=hjn$bZ3Ojmf6g-)478tpLIZhi z%tJdc_Qhvz3XFZxjxmJ>z8LD5p0fb24{f_{3Q>EBUaH!jm`$7-3-s1zKVTOpJ;Ww! z^nB0}Z>OcYrza?;h3fY?tyrop*W`v!Nc}Fr34ishknSY1R#qhVVJ>}sd9;c#k+qWQ zdym^{ML|x{M}^{!(;6LSqh-HBe|W9i{M<`qaZzl88~Bd=*8%@7dDBnSBQHOgdB#pD zd_$wp)vH8J3{%AxQQMKk$7s5K%g9hC^N`{pXlNN5RNc1W0>jsJ#W&H&yzNtBkGEq> zP{M67AI_h3+Df81MUC&n*YUGhBd44`I{bds<-x*09HM>i4Z3==U9x>B5_qF@k5kCz zD5g;p01WC5&dx{V8k%8e56_7#)&rdQ1C_te3hFz&4IIWkK*Og`NbCO%6+G(>SZi_m z8+mvv&1Qyx&?5dBI_%M@q?w(vFC)E5;trbgt2iY+m_D15xW!?rl#4kA)r}(CZ29&L z&3$%Cq;UZY$amP;ZzVI0{atXsdRv&)^1|FQvij9|9oF59`oGUgfj#|D2Fwx(FGpoY z#^JGDjgck{KeJsjL>1$MYAu#q)#TLBC@X%g_2HIRZmT&i(&DiuB;wQpyEhtQA4zW;B6HVV#&plwRD0Ujz*G=_}IK2QTYe z7;#02Ib=U__o8&Sa%#2FLAYlzB>A_2eW<3|k4xfh0&xi{t(?uriW}|!KzG2`j39$j zg-6U-<(KQ=%>hp8T9XSs*hSgRxzWI5eH{AXCHPRQ!h_jE+L(vs4=zj5y3h0_15cSj zV0cYZtP61=u>1xLP=r{II5d!mG4LtHj;X!Aa$yi{ddI~}*rD>olayP5!Aqx_zdW`J zXk8foFX*ldG8AbLo^G{B;VDW%`Z-nr6q4vJ2e@dw0@%W%*=@l4cJtsr&_dUS=xjBEd8jQl1pll5pqtS7Wen47jYa$!p zKY&HQzKx@vDlVJaeP?$^T>Lin1r`>W=z$YP_FbAHWIqfw%u*Qo(=s2!URKa-Zh{Or zii>{(0lD8W4+JK)tOtqx)?r0rjXYmwX?Am>x9a_iRa8)IuIG1s9Af_bj5AiKpEig- zzTJW>S{k?)AnDkwyiD3lTL*v5*b-s+W~*%`FgyX^13m$DLCpszBE2&E106T9LIom8_(kCvC@^@9=nfN3lRPRxtaF>hdOv;|XfBmiRyZk_nJxr7PCr#V>|zS$Pdy z^po^v@4v?6xs6$<%9YAYJ!|qfcQ^Pm`x%gqaI-gAq|Ret7z>60_>k^mxz}d7Uylt{ zB1czzzK%U40hP5I(oU+?$T8qw^bg+wzyMwGO}ou*Xur~k1f7YD8iWqAIx9|8w4qpK zL*tD~#xQfHMP>XORUS>@RFXb~>^`Cx)5Osyfr5 zp6W$|UMIF{7n~pXmC@e?)^Gcml!w{e%iQ@`OXz!6R~8gVS26ftuh9{1tU*FIVEvY9 z)28Wjhwq1WF4?BF30~a@Fk4oa*vT)AU5UZ|R#z9XY@GsaP~{Cb4^RL6uqu) z@{h>D-XDaee3Y3)*jPCjgk42XlBH1F<)!|(d(OXcZ#*~U=;$*EB>GsCjG~r7oFjDw zAkp?AJcbi7gu+H`q!Ynks)@W3y+0K>fq&tBX@0^MH~Db`ZyOA1yy~R|0!H6+{&@}i z_)VITvKsE93*>Mpr&`yCE?DBoVR=q+xuJM%{Js)s6gC*&1A55(l=|m|EPBqr7z((Y zGQ_qVMUf;r^Jtw98eN^eZjybZh1t~#V5dddOjj`{kqHuWsEjsO zG5(p+%0kdv-2_rBv_G!0)OKZe=HI+1RYd&Cfv~b|o!+EE+sz+<_&j(zblHE~0Y+cp;KdkjLL@JRmP5IAr8T_DTuv>?X^ujuY7QTE1;2TT4>yvz`jBs^NU^4JrK3aY<~2k2}M-2B|KWRXqkNQ zz`QcrQKmePu@K3VQ5M=0?luvKw5@2lxT{Os-KmLoIi}CvQh{qla$Rt!3QrHYq_DH+ z!!#mC1-{*XuQsW0Mh68P#0kaf2CDW}NPLhzGcam;$7nK`Ywk+Cczj9o!daYL)D@GJ zW$VjSVfvSy&cT6OGP78ChlJ#z4;|Ul2rD#2La{HCq;J`ugL5BdD;RgLH~)5>3Mo8C zXAf6u=>ws?j|Yy2z&b?~N4@6z4}e4LaTJ8AQ&4R59r{=&#;-shJ5N1SZ*ytQs%LAx ze~L=cbW1XUegO9IP$TKZwO+my+(hK>gOwl>7?Wq#n(sK?_Jf7LEmlixZ;Ch0iAJ)< z>Mt4~ZLej)Voq3B;9lZtYhHZ;UGX3e>2|DkKwB5xJ`dPU#-QCgFR1i{eFDx1_SIB2 zz1cktq^#q;D~g6kbwe04odu8Yrqm^68(7`sTs{=%D&8Ee+J8;=1Q}F!Vh|<<&tLB= z#qCmEm%Ki-G1n(cwxADM{T_Y$wC^1x9a8siStm~4s0`W`SLASS`ofg}2d%G@Kw0J4 z@7m@WT+SCy3oE(Cf)x(+;oFNnMT@VU2Ls_QjjnEyV>Gnihilq@QYw&ji)}PX90o_n z0v>85;Lw)aOOZr9{|Fe_qRNB%dKW$nyw(16j$3>nbp9}->G0<*bsAKt+^SfqScR@X zJTfweL}IH#r5&2D@NueeU+RSQ&Ch362m#)AR5v9;$p;3jB|NUOQ;rt%s`z}nDHh-! zX0z!d+@H^v6$9+!7SOE+297%+@rC2$InHp4GT_V$;4>a3)H@s4(eGkH38;1OVpc4! zEUCPWW!_2J0>KbS7D~&~2F0vE;q4|G=1%3-06@k&|(i>GNBKw4eBGrA$?~Mn2u0Q}bbN7!=+lJTWMbWXX(;T8 zvwm=Yqdh?&{F-Qo29-TJLan=f1KVPcC|;jpLbNkG-EEQZ|8aO~00VTHT50w(Gu zAkwGg$fB)A%Iy6#bL~chEZV3)i!inP;C+^ZBdNB;CFljM6?qpm*NYL>=L=&C`x)n6 zUt1K28;DqC_qk;sHG{w71da;r!sLrRa_zJ)6u;KjHwMZv^=;WDkC7V{0%Yn%bIadN z&h;0W?vhW%VjFJ3*p*hyxjlDRt!hub@@%c*BV~bts1GWAZUjaADl)|smf}^;)S?Bla|MsX>Wirw|)EK&ct(tq#*wfuN7H4efMAD}}2?wBa$leUuf8*Q( zUAn4Nkze<^r{cAvObIAQnH|ywDwd>1XMjdh>@qZjsWhf;e%M#kNfo}x?7r0U!Yoz} zu9YD=yg_OH`B{KAy;UW8okpyvdtbX%2(N{}E`hx`t1tYmFOmTe6~K@ zs@NF2Cq-TFxGs*>(68P62VO}oTxk0-5{UXOhoBc=GGByo?nXHkfk>`m6o7_7wk2e! z{A0Y2GUN}hO82PBS*0Wnw=xd)I*wt^u=iZDclJGoZMJdMAoNC`#Bn;5;!6<+P-#n~ z0sxdYat)DnvwelYIdo#zkWq+y(5b53_Y`h%^-;CveO$DaP?9&_)V+6qZOv9!yG+y` zONv6aMkSv@e00h3Uj|19B;7kwAuG-2v4Py*+O;O55z2Q(AET?;vP}ry zwWwpC_%qAzmQ&T^n+=<%J(K(^#34Z2y?`~9&!h4NYv?CUy8_V2^NCwl(axuYxxvcW z)h=nY9ZgW%z;NupsGBEdsc8^;1mtw;|38+4hui@U3)K18Y^-WW{4R<*`C93l%AYAm zzn=pX(t3Ja)kQHEvh--#&7vb_h@yqMR^KeMx8BkRdH89Sx(-JiN3vH8+0BL~vj2gC zDg1u#i2PdBi#|!h^(hAKbz%$V0^Cdw!6=dgK#spn3t))uhs1PnDjmAD*vDk+ED0Za3gk)M%A5d>JP&2HIW z3O_~}2)9HD7v~09TUf-KJLFNpn~r<{V0wFXPVaC=Jv{r=2)N9**(emD8BODN#v7hS z&llDCkL+-Bd>|0$+)Rv#I}HfK^pn~64qR-oNn_$%0-^XSr0N3S1x5x;GYLPbKDE<@P}IanJS7rLGIID{M*UYGfRMRCE77jp|yN z$zS2Wf?n|M6=TpPNAmU~aIlCAUg+YD_svsTNc4&sJ==||ulx;bD_)4kz2rjL=;%(! zV%U0q_I&37_))I^Iyj9RbVH8Q3hMGppI}bpco&&WW4kg;72cFyu)mxgsSF)?(tnE* z9^OMraqL%V&$i=u6e{-rh(v0s3+Gu`ihw|Z0~KR``BOQK?=5X;-ci*${!2R6ri;E_ zchlnW71o~1jX&P_C^GV){9klSX0;iDQRGrR(mo6!1pk?H*P=b?5#yv}Bu%a=wy*vn zm?F75Wj_c4mhTk`O@Gq4$!%9G9r5XbvK$*H`FVu-sETUEGd4YHdJ1grs;i7{j) z5@~#%ZzL&CA6TSM)XH%=M|WMRPxxyuYU~#=vGQJaAvGU48P&dQ3r{Zn-+!qRS@ zLy*34GY2(285xv1dsHUyPTcKF#KsaOQ*DvHu&{^K^6+Of`V+C$Ow-!l^5X3!@qp^e zJGG%-K#O9Ar>!TdUsT|$_;l^s{bLmBp;DhTr4{ZDiRuQCpgQWi6qbp7fjLPaHM| z;S|Z3O>^@4*<{a@?AT2W(MaQc;4{a*lQyWlHaNXss$^fIh{Jekur1mZ6Pz!ys&|uS zwdajwtsegmG+9T~pnUn`(;&U;UqN&M#*CFml6d-`tfu}O#%Be;mBv2u&)SOFB>j)1 zZ;xm4fB&DzoFYXbOvs^Bj%AopIUnXw5psxPDj9NS2PZA$$;5#&W2!&xxmfPW zk6dyPuu(r7iN)`{ozl!_9KVk)%kU$%OTJVWKa+;J@v4{t&v)H>ggP^wG%~v(==P&? zm4tf{zk+$ytoyFb>el=Btp{qG`nGn^6rHJA3%O(Zhl~kBBehynt#v2dY#tf}8Y_Ie z;Bzm%cR`THxsxYNI{H6QnO%l2=NQbOK&~A~c@6&qu_GU`6hDQr=slRT>x$kqn>1JyE3R;<@!)H&Ti12W#j$zK>j)^R`tn@6# zQn*D&sC*^pVAdd+h3b*>Bg$Q7Z{GhUeq3?IaqVWQ^BaR)3VcJw1D(q6S=D(YuOO{dx1WM$YE&A$X!EHZaObu6a~1 zzx2*__rCrsKV{_Uu@haez!E@8=+s&Ou;IDl(ce0*gQvKFUIvFtjYlafQt5r`AZhgU zjjI;U?WF5(Hl7BUU3IBXqAqZ2lOOO2H-mr15-L%<9YJ5vl;7?L-$GwzXp{f=t5gq3 zI4S?T9PCmlw!^(qsZ;G&LAo#({wqG|S)YtiA3V1_>+t;-q{dUXZF?@N&7T)NV}AE^ z&gUv{akU>>U?KL@cOOzf^D&fWVUY^_>!;k_*!JO@~5SY@pFAuib`ezmI+UaLY9Z= zcHQ^=WDO?187n~T`v#6pHvRf4IKg|+jDlFJ7yTVeybz!u09C}TH$I9pOf;E{Bh}5R@_ri7_4gCrmwAG%ct4A9AlPp9USOndNvRRkdY0Ov!2yP%(OJM zPRL}XzAl$Yx^p-+i!9!FW^OMQ+VEq{$6_{P=a`{|c<%eV3YApZ-{YFx__*NZ0XY-< zL@u)f1AEUltY*t_aZCD_%uEC#dnPsqGVy@EJHgol1}oc3%J55XXqmc7Oio+l)T9Yn zZufCE4PR9k^4(rcn7pgY_z%Q&m3E^M79=4xGDi}ux_KEhXL4dKsYF1^e(&=|HSWmIt`l0-D-Wfi}L6Jy*x!3)-_fpQ4ZPs{pJV*882A#3+ zbrsf9;={$Pg{%5AGjm#9tm^m9Z&K&Ye;F~v{fFZpbrOh!`WqS!Cw1$2=0zC#m>5T~ zhrp)y$|`H6{)F=8`t5;g>tBU1?-#q5`FfHk^S`7+6?iZNSmf`Vd9uAA9+M=!v+E=u zJ`O!&KK&!W(nnU8V%R=El7`Qi#(jP(ck;Ok=ww>5?lK@oH{cMw=lK5Ew9EP74NH=F zru>n2DKCaEgg^FTDKz`1(JqnV+sb;0YOL;@A9#R4Q~rW^Pi7+9;E8x$4`>U5y$(Pcz`-T zJhXCJw@!Nx2wL|{Yc%>!dIKUtbBTQIBtSLM=;Hs5%IN{HWcw2fR$ zX3%UD(x^(Ul7CRBJqKTzAh^_(;L%1%4yYh55FwVki2eG+%<|3|V!I7@&1wBli~-f< z6i}wdQ^~pZHyhG-AYhsW`9u{fDf(0E>Zr`}(zI}|{4X^MXx8h7#E$qM3zvj#DC$(n zEwo-QJ#)Y5(n}U+ht4JY7hbpQvP`IaSA)L4q!*$b7tf!&Bfb5I9tSD?}@^Pw241m zTyp#NZ+*f#d;Q(w;FiewO+PW1QH4!y=YB{Q^nh` zbFSTxP3}g6{9nneo;&Bf5Y5Fk(?^8DV>>;A1D-O(?OimqWH-k*mI8H?S5$JLei>FE z;UKL|>hevN*5S!8O`XXw^P7A_5fhQ?8F>Lyf8^K}HDr#B@{Fpor_fePP1U6d$vj0A zcBDf2{bJSf`PAbCC+>Y9cD8Pk%sGXc7O$Fp{JmkS(g{$B_>Qi8=a;9`G3)h0MBqFWI&WJ?!>bzS$lRBi{Pm&`hceC#Ho(Q4rn=l_fAY;yRY}Cn*YeN%X?Y1pJ$Bc=^Mj;8P_6mEfza3oa#v;DR@o4Tp5f_b=a2fr3uf)D7 z2_uc>^076#b+QdYe%#GsMV?g13tf@#*%u{y4&4zh7;aG{cMeN z2vy4F!c5w6n+Apx{OvShFyx+`?C@t42FZ6%HI(jfm{!nM70PjM5b|`pm)~5Fpj2@3 zP<}HGl=`R%d4>4|T9p`K5NxSH;O32M<#QY(tqxe8EEkSZow`M|h5b7u)7Eog@NDO^ znVCEB5T2a@Ik}1Hef#(EX;L5L=QqNa5l8W;l+Z)v-MED>5jh9PD3TY@45`(T>4Kcz zXsfhu%uuIOUx?&~)-RJxmhNR>1wYQC32XYOgW`dQ;RaMw3VgY6U!YsfEJ>4#FoB5W zxB%_{G*@>a>Q!(D@G6pC*+m_B<({{?Yj^cngO$9=g9V8QjFS2MemiZUPXgX)F_Y5x zuxbhz+`OpbopQh0snzqU^_5y;&W*rZ*j$nKj$PGr<9`$Vy`H`E(L9vE7h_gonEgjh z?QZ<}`47$E-U|wTUDugHsOv+u#wANv?Hrrb-pa4PM*se(ek5t|R54glxTMBUaB-nR?0%0KTe}^p%nFafh!E}Y>4a$jOTafaPLQnz!X2B~nINjhQ zK$HNALP~Eoo;ki#rJPaf-`VsS$ujj~f4&#Y0+L&Tjm?hgww}#B&Row>&-?1rx;|=} z`m73_7wp!m44LWi1%V$eU)ADLQxjh#FP^Gz{FFTVO#Ii>nCn#KvHiF>BcBJN8N}wr zv$(zcHtG=nW z;vO!Krh4$f4<8a9?d@X9>9lVn;KF?*fQ04~_i?^1RmB zbfrU~Zpwdw(n1fh;%+K_tmzCrg3BhC4oPVn~KY6BjK6`xnGvbr%dviFQ>~^WZV&i|V`llH%Qugwm)8j}j zBs}`tbl+$pt*%hyVpF*WP`2JgCn>jDc{_C@UbsrawXNaA1()5hR~Eq7w3l?N1taC` zepTx#wL^70zVml1@q` zZXRN3Q4i~rA30(5Y{nIt^OJaLtylC~X0Na@RBfmUJW3xS`d2oEzVUt4kI{zM=>6u$u8+LZ{vHZ1^astitIqqqq$=KtMpG(SXCEb27>b@F{s@z!Hh<3% z=`l3WeJXPSz+#O3!@epM3b|DhPF8R)J-4cI*t7qmY!rl=5dXe6vpTG1Dq;~8Wx^5v zEk~^r?+5m+RJJ}w6HBkTGfV)hd%~UWud#?J>yLVhdB6h|zDfW{mnAr?=sASE<#e++w*7XXR zxR8ZdPZ97vK57Eq8$U8Gd zuCe-~LiiY5Zy*$>210L{NUOpY589LgnVttssbB?)_U~DN@2fU8hRIY-uJQKi;oqz z6JIP7+@Z2Fp-P`lsoZI7Od0AUZLn}Al=I)L6ipm=>oHfgQ!{xy zu^k!M*mJdyr;nc|{wzal+@P3$!>X8UNrMJ3&cbm8Gd@6rl-5>ljQ`8o7~6}p*@gdb zPXg5et1{kf3)R3EM8-bujfTm(7uUEJ&S;3l3JR`tr@p zX9A^5&0H?9rITkn#SIFAgae^7^q!ML2uEv@tcbGq@xrpx%cC0=K#*GiEw48m=Eh_v zZX7uwahY=6;HqfL&|^N{;4`IFqrZ>1{|8daQxQtCRSz$3;O5Z?xoI$e@167IwFS3b zN7ho>H9^18Uq*}XkgKnKWUJZ6m62SvYOpUMzyK- znMMY`m30diBIfMSx}=(NO?9|sg+|Z9SNfCsCir^s|Bz)PQ$$%HM4F6#l7CQ2FDTdp zh7W{D)7^Y~by-9%j}S$%NBzSi4ei=Gty{$g(pfe%TUea5BSNQdu$X@?VJL-<(xjrm zDDukGuvj|jROM1g}-P;?tlb)6LUfjsiX||m&Zroj2UbO@ERa-$7GWm68Ua5 z2a0XsioGk{|I}rO|Ez!OJr9oW(K`bEwv;S-AxHYrX2X+PGU>9VswVx+49BG@soy@s zvJWr09_OYk;QP`_K_Y)|@<{tO3eP0nj5Tc9X4>(m za-Q2W)bTv=jEHE9O0F$6W%$Y+pzhBvGaWu-xCf`W?UPslT788*>ao8Mm^vj}2L3JX ze>%odtEs7vIQo_=!inK2>yV`)NIZaZ3V#lhQ#lYnl|251vQ-;?EBqOEq3{yuz~%uu zyFn0fRJdJs*bK5o0&cHSrG-O@2+eBc>v2k9E)s8M-uE4MU689aK6Ufs>M8eRqng=O zyR;Aw#lr609A5|Wc4A|58|QmVgp#kOF?T6e1b$&X4}2C1uuR3)&Ye>DhD#O!8ZM^| z90|`KgTP0Dk8pP6g1|Dj;yBA@&&GHW1Z} zR$z~N>|!SW19c+yMo)L#fNXJ%etZ&6z6A3Kh;9Ldro%F zcZ26d_Q+3D9z{(|aDa#Y0u>wj2FmFk-Jwcy`dR>1kZSC&=%SauqKyncou7v93#X2$ zg%)n)+y?N}wianTK-rL^-x#8-yoc1@Pda!!G#Jtr{2z#C6wM0A_CI#$>MehYOmOL6 zA@sZ+G%*7x5PZEA0$&)BZJlX^M&Al-doU-5Zn*!1GfZ%eF^)>3jRGs{Q*v;RD=jZ$ z`$H~TyW}-CXGfntH<1>6R}?6yOWDu;>7ahsntp1SLnU~8Fy3+lYO0Z{V9pOSmZFOX zz|Mb)=?F(_n5nnA{)>dL&X5uSTNGtqOU4_xvsbQja{&IIz*g~`%{j>Cu|{CdA5G-B zb`gC3j6Z5RM)~ySzHGX|o$0L^I6s^@JWJsQUe055V5SV3`FpWrBNJ%^^v{lRI1cEq zh*D3D-w)zoKi?Fp2N@E|u@blQarft>9n15V_IqX74UyyntW*Ru5zfd1N32;vvu;?OeBSV|6a9decpP)l8vs#b9NNB){E>+V?t?E^22FMbs5IKu1*b;N zH?XxQZY#dt60DX7Mid5T0s~4MmVUD!_oJ0PKDzlIi_pwU%o45qUNDmrC=yg5e#LdH z8~^D7%sEiyk-alRkuIBQHlY1IW)A2F_rE*Z;3mQ#8NTn>bHe5I0d|zY;Zgm%3hlnw zp^y?LgEd7T{nyQL2V(k(6P1ee3%Ft&+|bO<^5RR7a+7U1BtH=DFB8-TL)s8(d116* zb*sKV8^IBgZ9Hrh+|_ui~2dTdDki1RjYlz+^ZZQyvn-z!AO!$u-I)Pr8~8Z%{PGuL+WylvFI zWF_-Cp1bsxtTeWs!0o#q6%ES=M}Z7%uGZ!Doi2Ignf6A}I<@EpPEN<%x!jP|D}qt2 zH%}$KZ}=9})GKF{Vh+wqzUlbSxT-z=q0NhvPEBOSc2mnO3n6FCnT;rK%zh0IT{hS0 zWiAA`eC9Sa$baN#4{lMYkm=V!v0zu<&q_@V#+3Z@pqJ+-JyIYMo;4&83oo+wwJCEp zlHtcEvp7GwneXc~Im3V>D6EbK?w_(<Wu5h}+q>rXt488F3B2BBNyhLU`E|)TBG?Q*D0m**^DATr$-(~i~ zdt0hgH)5ST$MqMBF1vTrEc6d!jXaJb%{Z>+TFa6ZbwPzEDfp@mI&JJP8c<%i^$bru0jhaLf!_9&jw9`7y2V_QC`KMDytxJ)m_C zSq(K{71fuwt{i1DqF{RH+nn_#crXwOebW(DM7#$_cy1 zo^M4-nA5G#2nNDq^98?0SV}KuNsq5RmSevUG=*;V`q@l6j1wO4xud1#qhmWKY4hla zcxDcK_O|`Pr>u+=N~|J6{LL+QxA!T3m2YHv?|M&t00HkQpBji*CH_GEMiQ&hLYTL^ zAm;5-crpR?-L{CSA{X1(NQ3-U=@7*_)z#~2;eL2%Yh)oDNKoLMjp$~V>;!bAJKfvt1GCGEk+^5e4O*DlQTkY zrExOxfP8muYcwWBu%pTS@81Wa>^Ex*IWgc@etI0pU`5(0N>x`NNNe@hiOWq*xFby; zgEh}5Haqb(E9Cah3X@#RN#22{%1sShM>%RF#WPOM|=WuZbzY z@^dG?}{ZN?F$f_{9c^i$nyIZ&;D3}JqSn8i^2;{JK+;9j|@Z@ zrIKtvs$hid%V)}BT({a?v;|2w`~+|HtFuTk>jDLd)-1KL24*|$%Z*}M&N2)04R z-pG6y3aNLqFsf3m-u3T9;RVOzJPwK(IUd;T4)Ksce3!2ka&YEyXk~D- z5gjO4wOps{*GPZ;pdUP!8|4DDv{6`RFVQV`KETreHJ7I@IF*X(S!e+kOGHWMi68aRUqL^0l#W8Fi6 z;Er#x_S+_64ZQX8#mnLVsqM$8ukdq!;GW4_y%nsIZZ{& z&XKVhb1HZAaL#H@#!phur6vl|XXe-3-r@_m0$vkc>d@X4!B&eHS#9^?*lAht0uFY~ zqtFF!cz)WSd-8Gd&nXx)QS=MP*GcW8BeuBa&I z?RlQ`BZ5vvf0jDH+QV3*;q5TQ zl$HFrDf-WB-ahtw+e_g)h@v|92CVLnp)}GwP-sgMF-L$DL-NCR_C%Fo9c7`vNw%;C zmN4(ynzQ>CO!iu^wPfd^d_1G)&S~RbL+|Y>uJyDSe;vjevYTeq&qW(AfPFyMT!XuW zYYXK#hn6XCRdxZ0KM>|-Sc4M=bRpK>JduQwN;$xE|J zw^0W~5}6Qs5x=oqpbgZSnqZHKa(Dt|`-!TDf`qaVQ`1xMd?S8E3}c(p#uenbnz02L zd=;S>-TMYSh1VlVDy^g)L(U#-*?Sj822ym(6>U03%XBrF0#Bh#2WkOWTkZ@GYO~g? zQCEEJZ3IL7DA5rY#2n&D@MUcw4rUyadx&eJSQBxH3Sa48UdKc(8puChNnok&+y8Pj z{A_YfQxj<{n;7FKDDSyPi!aa=S%^0pqgtfgf?A~?BEGfDsMtsrcdVP)_)+IQ!JzibpILgz>J0D)q28f zqPuA(N55+9CFHqj^oR&EY*;WSIB(&pid#$)rX-ygi6U0Ct2*C2wG%F}dSKvNpuaWp zCbM^-|F7?ZKN9`V5#omG(0NKc-mz0LVJK{y<@bIiWppHTbO(!!xqtZg$2ee$*)dZi zT8^hFSf*MrT>mTRXtcsC1p_6^!3WM2b1yJtvlBfR!oeLiN0eJ6AREcyy4Za&1AQWT zr4qiEBJ$*mLjApn1qX8xDt zI(2dch2V3ULr|bu`dgC-NB+~{zP*ovzUjtJLP@_O&J^kTR;WWb8r_mq z{@Q+07Z~RI=-QwjFllrGcz#VGz+8-3MO4%Jgck2tSLlDJ#^c(~wE0y=W#PK7^bkq1@KMpf zOUF5Jn8o6`mCp1?`O zzx$uOB?mM<3xzJ5Wb)jFCmX1l0%+I9o}yUKOo0m~3r4u;ae zf>+u!dmQY#DyQpGw8>)>?N&PpfO-6E4{F5y)liy3HgA#yQtyz2ud$-=E!FT4)P#8x z6_|Z}aFd`&1w02A5m9r($frD44OJ<2v9w5!8Rjy*KGp6Y`^I$zD{G_ z)Fm~n0GC$k!Lm^v)9y6=d!bXBn(EvOw`>Tf0=t+`xV3t&c=r?@%c-1Jo57ird)Fesd2K1tF3nW-lY*lE;*KK<*WLt8lizV8be zlNw7`)6r6oqR+`bu)4bz~M#K1#4$$Bh->F-+uRbkPl|OEiSsVJ)lh`#np?yJF%0Y>EhZQATj@pa-D~X z7xs6E*<+F*k&kTk9HgWP3@Xihv+wWiXS+(de^yWvVwV-_mD{*Vjy9bvB9Jn2rCHVg zYxkD$rP;qtl8`ZM=qYM-|19SF%S7%hZ>S1O1uEO{RfAl$nC=#9299TxQ}J{0LqZP6 zv1otq<0ueWFf$T&vro52J5B1ar}7lenOeo7x$cuiEH7w8FUm-8LWnx`qg$l`aDf-V zKobyjvVgzx&j%=TC}v-qjJK1!*Xw^Nx&UD*LDs()CyE~qurO?`fDe&RCG3%mG(O!p z5_oy%L3_*0&4dtwOG$P74u4d11Eoc)%TVnf9VvT0d*V&$$&8wxo*}0`wxFkt3VU02 zI;D?~v;|WJ%2zL59X1*iEq)Y`h*qkThed9!JKk_7tzkX|eYvI#+p?HQaTBpaewn#x z0v@t2w1fh}#u4RD=Gh`!72n>ih{n=&K?UU{eMIY#=_fVq6LU416Otl9ultCgc~0C& zOL*}06s4dBR~RS8a1nk4xf5z1;CJ)_zkn{t7dP6J>7g3k=VL}t0L^e78+aZT&=*Me zWWXYCW`;f7^*uC}I^fm&2fmIA`WY#n#o4cVCDDsQcz8MJr>jw0(gF0+M%NbX3!o`B zwi-aXT2Tk9HxeI-4GII`P$m3@WH@$o4fh^Id14Ib#5=k z{+O)g#Rc;V*Djt0e8)4iRM20OaTC^($65IPVn>c35A;9K&5j(6w3GI}>^q#0?H0s( zjY@OE7Ykye{>ppN1cBJ=e20JfY-u&>v6(+V= zn;wXlPVpUkXr^>VvdGyb>*tlYp)4Z8W28XYdS~&?i4&!O0EPm+j6-acUNI~TACfxG zKSaR=<_E_wlZvEbnr&);Y(mOoS4#bIA9@=rupD| zS)2oHEm$+o0^&NokxXzoW+IwMoQ>^0;Kpr4YaO50Y z8nh38ecYqJdJdC#GmsnrIB07*wkrB#0Ghf5W{ioO4=#@|JiT@)Jd_jLrZu}i1$6SNY8p()E$Z;oA zY3oGv)?iz~>>c#i)TE4|)D|;SIRX0!UPHRXPVJ)= zX2-4^OB&!J$(q(DWC{z*uAm#a{x72|~fkRy(;Mur6W28FKgc$6YVrNbH_t`;Y1{XDy&HV6#a366cq& z)@LS3@Y#Fy*bdI8Z0TtxJS|_uS855O9P9) z?FN9{(rm<@Ln_QV>=|m^JW^`Fz{op{W-}A9m8}xxssVcru?@btk@$aKRpjg*c;xHs7tuXC;mWVq{L6c! zh+hXBo$E9*(AitoWS9@Pyjo#3McdyI>nZm9UQrNJ^+KL0Y9|95M3V}YX%=k!-y_4V z>tvS7aOCm*6gWGiTRw|<-OLugwRLe3{xzLOsT;ow-4#o?;-L{!)qaN|F8SWgm-uR{ zltXj}=c}@iOB#zNj8e@DdSt^cS@_5g>~2+u=Q9QpenK0xlPz`M5=zy6;U%o~8ovI~ z{DJ47AsY3CGz{wNuta7=3K(|tY9#~r_d!l#`!}p(35toM0 zL@}UiiU{VjXUe*g8 zJaw&OVWgtJYw>kfdYgruFoQ2XkNt`=UbR$>I$uI~#E(1`ClLpi`sJPGGxxgCkx`zX z99Vc_#d=!U;_)G?n--{1$R&|~ypROh=(mu%v@7^TXs@=r8Uz%E=_yMr3HJG!Dg;JriUW=F4W z#^#}S{O97iB_+gZg=iv*NC_V!D@GpM=`pf+iL3;BaEd$f+KdUM+OC~x3*Plf> z=>C#}?N@=_vg|MDQE=hC!AAY2>S%Vz0*ifCJrMqlJiJrPrG)Ivpy5)NS2@es~3!r zrdv~3$nFYDP#ACiM8|@)%%1ja4@f^P(lKtEg{&S;3123cfw+h12vF#NvZcp@k-*8S zGVYdDi(w`??#&2D0lZO>)Ya9Cgz+u`(DYI{7bb#*9Fx(vE6;{>x5=G+UnZC}hSOS6 z?XFiSrm#5Ld;%1vV;n_7TS*;CkZt(#xaf|z@(3QhN4G4IjwHnwMB;elWcHTF@gPVD zTh)jLd;m)pg`R3So`$k&hFIEXa3VO!hPc&Hmcf`W4jD!U2fL+Q3BZiA2&Ej+TN2lug5Bu`BGU>aJe6>!T~n5KTP#UQHJ?+DKW2CJ&nH)GF{UU2Ck#qDw5yq)~{ zitVDRot?STbJ%EyI9@)37^IM=#Li*?h+9{zW&eG6*$e|Dx^As@xn)M0iMyKSla3n3 zxx9c(oSBkAW#7H_`nu5EU!fm7+2jWgaKDtWqmms^u z9STwv^vvpHk~E|l<@E$$eocP;DQ^V>AAl0fw`mofLfDUOplS95mT-NDSOtpQBc*5h ze|(5N6wgc3OB}Qnq>|4y#K-#(di-qi$xWYLqWCmwt}q$|UuG{g>G-|3P}U>3x%gp z&jTZUBZ9J6QJg7)9$?6s9?Ug@M=eSoR4|!C+=|L*W-qrc=%UOg+!&H zwNGYX5cmPJ(8Z=x{Q)qVk%N{3T^aL@fT9ZWK@14R-s@+I^mh@*KW5DxBY1PkU5RBI z#f!QZBDf0*t%pE{4~y!@E!6(}<0{u&+idr4#ahn@ZN@g#G=Kk-_OkzhtYP-wF~#^N zKpPVmrYOmi_!4R-5eN3#F7Nw{N2PlRe4~#_10`#To0A=?G9qPKamKwdw0c1~H*?Cz zhX`BM%4b)i1KaKGj6dS$!ldC_All}DiF!krWt1BZ2}<+L;!XsGPI(qa%d|h z+z>yEFD-svkwAnkogpkB#DsDX#VplM3ecPnFuen{xm0$0pyABx-gO;ix<@0*HSH1L zsW)I;pmwsQh_S5@PC082q#LEb8jsne{_lUzz!Ufg!oU! zTg7AW_i*r|s>al|Ly9t=1%enL3 z=Fkb*BT(BQ4I79{pmgx)RNVWSaH{s2h7B0Nc^`u-{6T>ODio%Jcb&g|0$JPnDu5)( z;|*KNw`{qAn>G@b=-l0@5ZW%M6xgVM4H!&Eu1=rbGW&$_3|kF^gy9r}F9_iFSn`TU zlcVN^fs4_l84)^j>F9pOQ2ROxq1mUFlps9O|F zmTmZEpaRA}?hUr;C3h<8F5^6vJ9HV^MH_mtAs}h$SwxcxQBr}nYLS7#?-U&`XhRA) zV)9Kc8sMo+a*)>WVj5fJ$kU_Hxp;B`bS_ISba@qb#SE;B134Hz@L@XmP+NCP6@3nN zin2!G$$q@&q5@SbWcVc*MfHPb{z!vBvoa9Wg1drIo;9{zN}M&fSn=bMPS=H4YK>%I zY*FS2nLS1kh^=?v=scH3ZPUgJWid%y7O(?S6iJ%fJm$0Ap)8zj!|TPYdV(0}c-EN1 zalpUhL)pl7*3h9$-G8XjDIj5K({2LW6WSyRGAdjayMTw>5qk~bbq00(!XX?YnslPCJQKBQv@2Gyrz}Q_fuFsv z0hM#Kie%c!1>~D(XINw{TPu$i6@icAOcgh6V;e?b2*Yd=iWFaOu}i4X{yLRgoJ)45 z;y|a0soEs;*(-#?NF?l^AeX^Tsdf^!Q3LCR1Gx{A&@Na09+0)h9F82mqruoIKL#@q zLMFXX7t2_+QO>X-ijg9ifZ}m^)>5Ry@d<5G#BS-KOq0t7iy1G}3u`nqELN?Rfk2=z z(#x=Piy-#YOZthvQ#{Kh{y5=en$s)3eP$(KY`ZU&VOs7AbeusrP_?ZY;+Q14?46-8 zalc~eU-L`eVrx}xCqw3Pa*PP_S#e;Vlm$JK6v1=GTl+ZP@q>QKBc-@7S+4Cm)SlX< zaHFH(fk5iM2+dtqJ+^TT4F=NcL_KN9{(U9%`rD-vv@blP|GA4o>&?EI;kUsz(o=HP zmvO215hXCDQ669L<@#BFBV!0V(x0NZx{8pA8Mp={RW%4PIYnK=hHb?;Ag&HH*wx)F z=PAJwNO*pNjsyjR>`n^>e9lCff$Wnv(mNGZJIoDaDEjR^f+(gWQMtV zbY=I;Q^HpZT|j{}Td_ets2B@)N4TPd96Kr6LuQeIGwdkx(ULlsz)k~_@N2P!xi}d> zwX-~)3{&llv>!Sw1Jy1Ho=OkWyI0WOQ6qF%0=!R7R@aI*FBvVaxac<28K#ITh(S7) zN0GQN_!y*7UuP#LTVM{;KD=@;hXY&tN>&I9^HZyez*X?43zi)Se{1i;k?i9bUbK|a z*$s^>oE@K?Uaa&~;2BzmA{8WM= zJ2hMy7(rV$5}Ys)`I=tn*w3mm4HEG(4POh26jqS}Y4i~c%kgdDGC(-88P9a6b1Ptf zG>MOcZkNFb=tx6%jUHu~zHECosD%RUDpL!L&|M!mt%zUDq5(l|kx`JXin6lOlL+~| zLfZ}(BmFp3K^xs%qp)o>%}$knd4T(*G7L&|aqL?DpIS-5a6YyTq^c{+NSsG89fH%c zvdjr-L)!YfG+>~)MSp*3->P|Jq@A2H{wQ3^I)0j^3hnRp>j(A)p)0|7hvRq({$4^q zm^_m4i~zCZ5ehP=*}#*eDe--5RV|`yLmWSRp5$Ar%1^_Y8f=Z^3b+E1Z7IF?2oJSP zK~`17o}W>w+s|ouO(bRE8O5MhXlegC(GmzPCCUpL1ik)H>%>UrOb1_5df@{*eL)5b z*~-v9ZbMwA83`63OPR6R$H2CXNqXV35tqUC91any0)W7XWupKd`c#&7V*I+z9X}o( zfRIEhrDL+6rcrT7WgHmgOt(Id*(=T)Ci4R}^)uohGO3l*kQM>B7z;t;TUCi1?X)Sz z&n*OMMHLDk!4am#61Qv~m2nl7wf0Yg0=kvc@rM6k^HPG{#6{(kl|*|KZr~uWdYJt+8LzyXSTxOl$O~F!I`TEJl0`-Y8JYyybzk60u#ucM(Z#D@azMydQ_H%4dFX&N%x(B| zyL@f8xJ_f9%uj(9@dW7V_Joi2cI->6_OCx^i((D9_pWx%eQ~0k|N3LD^aY>NxyMJg z&*bfkI*BB^CuirEqj=J`Mk_3hy9Rk-s#*nmfG?BuU#uTRxy=L@mPslo0#=9_PK-Cd zVE$2>;>W5UkcKT(Uer_o%2-`MwQs_yLZr1 zIj8V<;qa@x%qHA2s36!bxgwd>-oSM!P%n+#wYoo7e58ROQw+mNr*-R*@z;)Y}ssj#=sSkGV}5{MMngJqI@Kd=EMv-}X%n@CPeVQZJsgIT-#nd+L z7J8Z}ixz0nr?6GdT@XylLDYZ@JkgeJX$9QDLyqDfc=bsM%li%zYp7+bPFY~?YJqC- zc&_lE8TxBBhKr3XIuLMUBl%DaSdX;#@J=~(qa4Fvx>Y`(<}2n~#vLVq zC8ZKZBrZRZs&`BuFk0*o$EloRl^b(O~gH-RN1hBWESfui1`=EX&6x` z^cVqJZe`zOX{k z=5VNjh7+&>&_y@0OFH1PWW&q3GFHtI26xh%(JrQjjAS9ycpiSYL>Dp(IJ!fJBI!2X z=7c)`d%;G8V_GA*1HDlK{PPFo%b}d>hpuETA200K7d4eJ$MWy)R+>7H+9Qj!6F@6>U35Sdzm zODv4kk@Rei^zt<7lKzcuygK^xieW=?2<#NxQjLEM|6V!@1$bkg7GX5IgpQxA+JJX8a9{~tx?9?#_e{_)Lea*h$%9OC0lL@_pp6vKa~~ z$0Vm1%2|^0c@8-nIraVBzrXM8-u8IBciq?F`FdT3qfY1UwR(6aa?KwO4tg(;{l$H!VwLyq$4&qF0-iCC`<1Pmzayo~r48SD2VDL#jy)3A$+_&j&pqrZWmSK?n0Y z)RLBFq$9ZQRDQWlL?-r7;8`z%`fRDdspWuLvJ~rLq0?~VgCy>& z=SkEe`4_-;N+2W_6dP>z=pc9X1(@xbSB>;}QGP9-WAz2%AP&}$p~kDCq`j?)e^9U- z5)A~e*0(HlLXbZw2j*3+C8qFS0I90J;0#dYo$XPm6)tWQV^yfJ!FpKgshO)b2$>j^H#%aWM||cx5U>6?HVo6PikjF?u(i28n8S|)T7f2)`4Cb- zWOvDyg?T4{(xr6cvO{GF$r6#MVp(DcndS9dHZo0T*tJe9qoJOy?p7McT=&*zwr&lEZ8Zal3`ExIYS0-t+SBs(1Iw5wt!ih=o{Xk0}A=sb* zv`ULXR^kRduk4#Qb=ByZ;2JVJSc)-x9kWLUfN*~gB%@u@pQ&x)=zy%;tL>mZ4Sh{B zHxwt;3m2v1fa+?#OeVrs(yV1|B!%FIU@XN=*s4x;VA@&eTSff76Kdm3G5XdBn5{Lc zguILY_qu2)wn&Rq^_t$OT8kM;f6OFi6W~Xwn=ez>m>gZx=T*j8Dz|IoZx?0Lpj`G7 zJ_+~5bO3%=wMO@C&N^_p3-}Sk9nr-S6~+|^S=1UUDX+h9kJJY#?>9Y-F!d4>2KF;@yD8)&v^rX zt|O5^tT{Cj#rx!a;wA+yN~@)5wQSU6sEdy^b@7 z9zH)-RaZT+@YsJvOMH(^D=7(<&<{*hGUDFkACLO$)Fu$Yt9&h(G!sIVt z^mjhv_v-l#%cz^}vT~V!UNbJYuYckE9P#3ZeM#oXVH^4#XTz@ z#{+@Ydto*b0P0cbcV{H|{(^l$^4TR3B6Xfx81*NYQ?{q^~KjU~KsCpysa@R(Ve`Q-S@{$?UmwOB;q4cw< zc|&+(#Bw2grD)^VU!@E4;*k@3N2+UPy&G=& zg~i9fxcw5aBqd|v#e;zt%!}2@AC4mImvTL;>>Mjsj+SCRA`Zb`zi`CsxOY<-a{qDg zvM7L0o_{DZd*^@Y?B}C})J|PYbkez;({UdB*eR`x`#YCUd_bmT?eGAmW=R*F){g#% zb|il$IZfeTV>%wxR2pljGu_7h}fMIR;MnY-`&BjsJbMhYYVp-OeLrR zn!_}#_pW|#7+h|#jtFR~^+GSChpkjOdSBs%4dAAs&Tb1|>=zzEC%noomh);r41TYV zWV*fc4vIMM(V=EBJwkM~Ubgamj6H{EtY3DLc^xPL=Z`WyQl%gM3N3tMHn7oYv5?hj z*x^dI`SIw)DC`$gcEzkqY1xTOs)C)*V9mLa+LXhQY}G!Ie_BM^8=c>VMR}HKS={qn(TGTBLOLd#>Si|kPM_W5 zY!+HIQ<6p%xs^vx!J@*-TYGmni=FP@e?d*$3!6~YdqM3UA-i-G1o+K<+AB4?2zy+T zr4MX)7s}XPvtjYU9bUhSO%E|~(RX&*gE_PjACe9H?7t`EU-042n>PF zm@O4>A?OLfJjR-LsGA z%w%(qmS%DB^^alDhKBRZotJ0!dWa%%Z9LiTXrL~1KH)hknQqZA`0SE94H|%2h5rwfDHots z;Pl_*bV1=|p?`7{VTidHX=VIr2`BS3Avszjw|OEJ=1 z+WoGeBS)iRS<=_xXUGqIfi5C-3|)pu;7D!*vuu-#?={L->UL4qdMY8YR?kI$I#V)D z2=y$wOrx@ezOC^C;Ja*qz7bQ~ci0{@V6ITPT{6&cDrHQJ9Res?ML*vwoJ@Anj3xq) z&pz3~blu^e-*6+Djo)*x6576t{q51n{|+6*&ZXu;nZ)bxRTKFDgx0iEPz&Q=LnT8e zf3H|7uURT-bAVD(EtS)Ol(e`gPs+Y`wNyJT3<^egty$hXx*=QkcIe z8s}j-?*RC6`MLA0SG;Tz{PE z^^m%857ZQn{!{FK|DG?MsSgO+q7--vf{gF6W?lJLupw{QuKe#?VcasnSHg?A-%UY zJF&U!`dDTo-2X=Is%}_${FkCZ^}VIsdbNc2XUGuz;X%pb25lYr${yM|Cz#Zcn_)}oi1}0l z*%Jb@?IC6=u{?||<#?}066PgRbk6G)ugwU-^((6^GPGbGDtSd^ev}7QqN!OXxhi*{ zSEkC;v+Bnw?vP&wVZ#3#jyZDypOIg7G0LFmLc0W67IxlpzS^LSR-wV1;EUWf0@s}o z`_B~NjKkKgXM-)bY35)ls*8sdT#nl;lu3US(Q~u1=}TqKcb`yH1F1-!Lx4eZq1M@o z#-_=4Sn0fRIf5@GZ)>`LV$%5*cM1s=75{g1i+9nz{MEL4+d;1VpB}1d*aagcK+sq} zzm~9d`dfGS4LY{QK95Tgz?e-HA;c7<@gO%8zgJp74(&K%ZDd-meLkih?OKi0(@S#X?HeTD)arwRA6(&;Wl*2ZmA*SD5vL5{T&EFT1M5~#U*yw|#GJM3(#{t-(%(@=6EJL*Q&iGCv0z5 zUvouh1OOz$x&NkV{_dxx@HPZxa`UjCD?1d)L#hg(VPA#l3<|9nHRlGACp*HH-cF9Q zC5@smMy=n*>jC6UNVmSY*5|9=8Cq=_$XxhfE^cD4829LaJedH>4s8TCWn+_r;45VO ziM@zCW-zybcrV9BV=!`C-`CuA3mRW~Y4|B!_GB*hv9v7V>cm{3lKPs}B);mIS;JJ) zPqED{^1XsHA|;w)bU~4T2zw!bJ&+8L=j4iJtX`USi&iKLjr8+7o3*+mECs)1!cn+t z19jHC+i_dLDp@6>zx>wA zQp684bk?n{#^M*-=Y0@_tABNW%TNh&{)9*y>gA>cG4{dNS?(cI;Sf<}41loGz|7m1 z+wMn;y-!yx^bHjt>8CB(2_MBYB-0bNnPXJtInOq)S&XT?2r=ELu1M6qG8`;XS2N@# zOQ{0Y4q@nfOm&m4H%A^jDVO@+_*IXReVrG5AxKZ*T>~+FBptbJHvGWfN#q%aY8~?y z^tES@UY=CVe04DEMQh@4Bjksq6HO+GDjvoGmTui( z>i|*~2V-0#?RlWf)t=R8ZC|MsgEf3c4JS@uSm1E*8FwnluhB{>Ld;B$v)&}@4u{eysBfT?D%hhwC^~%*|7Gt)j)j@( zVmY(7ZfwP}6nn%L=}Xq&$873@5gH+DJ(4Yu{(g|g18{z`UA~K+i*;jh<1?r&78tXM z3O;4Sb6*VfziJ~4_XTsqw=GD1+79~PHVt~@$(v&_e5Z2r32KJ}9jIbH%$`^*W(!}t{-P8N`IhQvl=t71#_TC(?3lOTgA*x%EhXt@l8a>|*fE-BO==l%5 zifUzJVf zUHlJN&;7gEJ>?mx`ukMPJu7`XloXze82BeMS`y27m!8h<=p&P zl0b4#uwv=Z}b0|9py9M^S^lOf#xCgbg#G8+}r z_avdLA4Q-;EH3^DE{v}V- zG`Ix<7)SO(vT3MNJWE*;;RZ_$&W;OgUULYr@^K zD}CZSAj$ebovsO5g=y`$~{Dqoj!?eCW=b}#Sjm(3>&`afvhbp0}FGm&&sEjF#9?zWev)9F6i zAokwchVIY@e`RYjNT9VhK}MfBms7t6X}f+iJsIab`X&1Q38v1Y&1^s_Q7joF?*-^L z%Juf7ZmIV5l}SpU`e`S>J#X<=$Nm1?^TcZ9?y<@$!xN!OU?6?Vl~Hc}Z+~O|_NATG zh}Y_QL!I7I+tNRcy@){(gF>eY;p2nz4Ps{hwgbyF#MG_4NO>#5M~*S%?RH5Ns9i!9 z9xr3Y_EeJgi{K}dOI%7JfbqSN{s`gPZrZwm`J2Sk04&PW(iUA_*1TZkQPz%&%2KZ73nDz}jQuTg^cNu<2!=->ev zBC>9I71yB!O7$1id~N<4v35M_dsDzbfVp$TVv| zh`vm|A2<37C=(ochTvOb0K}4{7MUIJI<81Rut_hTJ}PBCCR2YO2v&AKwuF zyQ0^PcT#b}`eK8dO6JSZA<<`_z%famfu%3~=I7M`XArQf5J|ef{Kc_uCH4Et$5~!R zVdlPIzE}9|DWYgXq2LdDF4_exh7*fp>EQw8UhP>wSJ{dYk|=z&ASF88njfS8J@#uo zWpY)a;x*01PDblrRZNvAF~OEz>t8B;Kn;JM40K^aj}r%))~>hpyLoAVeL@4fv%@wb zu1B6WWrDY>1*g!B;ftjW>36=o;ZTM6cd?HkT=F9}Tv4Cmzf+Q~D3#H6YeiH%-ON z1ZhY5*X9(Kz)}8RjxsZwj*jat&;Vv8FPHmfVbe&`B%(ZEvqM+7nq}htQLxuP5)?S* zT@8QpXU3lZ3eZvWwkq3(s5fY%*KWy`lYvL~QcTs8S8lmSZ0EMAc^d>4yP;d0Gl7Ep zYmSpLoyIEhN*Vm}&%HX@GMG|p3nY{gf7g0sb8O)6=#YJo5Ff;`tK{l%D(Z-_vO@n)9p_0 zFIx0qZZuBrH(Kw^h`lxY{d~b%A=cA+C!9g)JG*02zXz-^ZRdr!2q~6`X2AZ}}8DGKPg;Y?dezXd%bv8#_1AY?myRLqipfQ_PV=YLaYQd(Ck0}JTbJ^&!h5Q1{VL!bSin|qK z9o8d(e01t}wMKVk&D`_J7MZ{_?|j5ziRm$w0Axzwlajd+uikDDZU||sE#TzTeea(D zgIbiY4g>dqJ#*+ybSqiH;CVM%?FiZZg40_6ygq8b@3Zk6cYb@BQvz zn{JFr3jOc>!kr5cQD3zJnA|?~A&4ITp89s%V&BZhQ?X#Il)arrMJ@JflYZ1a_K)ds z`88_2V0DZ(*LklXDzKV}S4#4ILL$NWeJE4J^_JJtTE~Tql34La_KVC!M33YQdN3Or zQq+EjEy6Pav1StB3ywT2)DV*^U|q-WJz6)Fn@hU7%zE)qfkG;JETcD00smy zae;R52e0aj{kvu)?QM&(90`YuZIiFh11Qgd01_k{J53r(IP;`PP?*see!O%V| z>XN+bIf6rHyJoeDd>l-VYk)z9``MT)fsG@9!_qEaSj^y>u@5$qb!hISoM;soe%>{< zlIZpAgQkl@VfJy+3V{g9vK)&J`j6l5HlMmp%LBMvANs22XeIZz{ts%V+o?lde9`7j z4=dKP{_b4PGg9kd9hyHJv86Jp^{tp7vwmFGc8!LIedev76Wv`tZ#8<-e*5{{?Ic_7 z&qH;9rM+AqFhTL44`yKP)^7(bhkiJ@v7HvVw(Jd9olQnlTx=4>R2+8UsQS%-=t7QN z%1U~I8>tX_N{(N}dY;_fHs2aKa*ZB`0C8s34)}w=>iRVJKhP%dsM~(L#NoTvbJ0(w zaHw)sYTo7r8b|e`_OGV{9;+0+^T=z)tj`E~>$$*7uP=66N4I86AGGV;mvBO9oZQdtb?|KGIv)=jbDXA6h$*8HpjG zZBrW*ZBMq$8nv-@Kc?-jd=E!~oA=0EHjrwKOWm5Xx8@Re?TUFI%rSCYCeSJJt~rm> ztC$A7FGPwdH!i$D4BO9@qDCu|C{k-j*g&zMjZw%BrBiljuLz&vy~U&IS7w5qfo+d7 z3KIf0{s-#D#Z7SJ+xF|sL!eD>3b@3G_DtIUpslR}$-ODt>E@`vMd_Q#Uiy;ngZ;`H zYS+xM=g-HS$Bdr8Y9{tSP@eo64LO$@J4s-X?863d!vPC^jb>DIrpDepMN#~LL%8fn zteOeRPb9A52?6bpn3~+0Cz$t*8k#k6>>#$lPR{GG7W?^7W34def?lSn#;aDy#u)*!g`nJWOnpjJGWn5>T7gRU1> z^v~@Ru>(~{;@u6Yv*UM>i6H;${eNOagCemGpSZCwK4YZE;0v-|v(2pg(eg;+RiClE z)7SS#$Ld5@QGWjFF+#gy*B$^eM?b`jWX097yqlTi-oRk{8bz|;}Qv7rn=7FPJ zQe_KU*x#cDv?A0BdfDdK86^(-LG`lupF@>h%^m8$MshW|*tB}Mxur1!%To1pK_x8I zJ2-r=tfMs%|Fy7MvIWV9S+Tm7{pQ7(k_ZS8qr4xHzk5a6eOuty;AcKjKNgQu?67?s ztmN5-w!JUeA+BR!!1>PeTMCAEnTVxa`Gxh&E99Y_jb|*eXiWt;D8*mlHZ$ph(w#PcoCdfmo7JT zLI=${71OOxlIKmsS0S~Hip!#0$5duuF@f+lEug9*QQU4Uhbm2saA3K(qcO;am`Qf9 z4$y{03|WI2GO=fC*!PMKkV_<+0QvWgGkqyQz2T51t_5s8( zg130l{T&|CsG=Gy@4B&_;F&&NCUmxUAioURadJ|WVoa;H;2SdAJQ_No%5D%?0*CyT zQf|!$b3>?Q7qjL|2VW5JP=YdgB2Y_%c`ARQ>$jB{a1w)t1VpAO%6i@D$3?MRO%ny) zVOq>(@+HWZ>PgSCJG0B%jGA8|AN7b2l6U^oYejF!NA;;htrT2ybo?Hug0AXUrby{< zvwNE~A?-RZ%hdq=XE2rX=AkI}IVNyR0gQt<)|cF1P@Q{R6kp6Yu-;?pkrI8TDDy5d zPR%G*O=m6{YmG5jqd`aALaYA+q-qI<&4v9ca#|X%yOz==b_tMbA@J`R=5}~frYxfn zG53mRZYh>H7`iGalhuNb7?`GrtW5#gE$3RV{G>eONxuy|yuffc5^eI;k5whCrR0Mz z0t0}wg?oh*=G1(wCEx6?>WkYB*d5-H>_#SWlH6vj70M6OPfsv>U^fKESWm`U%_Q6! zW~E8eM5xS`^DG2gV`E?N?|GcDbvS)61qPH>&kt>N5`rKu>NIof(RFj}M@5n*ioYn5 z3lF6T;5B1Ep2a7~i;Y;HR42hK(*qSSK-EdwxD7*|Tx^U!Yt`^lM+oIt;GNiy|EMzi zt5L3xdLe}e;=5+5eUETSt56C6>h(8tWHKTilh?=6YbA)b%)>KV+$tD6qKG*i_&m>; zNuEBvQ-7!9I$>bmW$;If>cQKZUe~6jH3ulT8ev{3MzH^vM)D6sZ#wAwRedqWT_tKtQZZ)5X?^d0iOtzmMroZ}H&P6153(^xcQ>kyUkZTDe`WP^ z{p*P=H`$`E89kl+-A3j|96J6ie)O(HTXL>pStH`EWI`gC7&}rCNfOS`1;Ihk!-xd> znftR1*&W+eSVGOw19_o&k&m`!?IxXBwZ59mz&4fVV^&M!EJUORk_`T#y zujZt%{T_r@QucqwytU@&L?4d7?ea(up8PT)L!08B7wlGrYrtY#EgBmx4U0dV%h+zF z*11d8xy|FX9lWJW7SJ{lS;+-XR1~E zV6%xrS>dJBnDL`+)8|sDIKq9R`~uqYs_EzAn$g|JP5R4LR zCA9!F+dH2+>Y3C0td$Q0N3CAfpKa29Dn9klZm8_a`^&{MoLn$wJo*}L5zfYDb=mB@ zCOq0)`tT#-UxvT(vrlOYUigB2a)yvcy?FfD52Cf2E+&U~vxW1ToU1IVNbIAcPr>ZM zS|=;t(!ND%6~Ay>AmyFPnL?O2#Q<~`4xJ%-KhkLJzT~)rU2yolqc#=0s+vDbGdTEU zVvu^!D5sdZjB50IZ{Wd;C>amhf$@ItKaRCayJ@Xvej28=Ulbr3)63&u!?`c2@WwD> zRoltyjFR{6g|3(NiY~a92wBK(5rQWN z97Mm2xLzk?kva8T>}?8v47;pG>m{xEEvh#@r>MU3&^dX{^y07yGmL~|i`;CM=`6{xWWVTZIJ zaJjBNW`gm&EP!@BGX;bVM1IjX6v$SOChYOtQ=J#1$mH&~Synh%0{TA#C2NJ6Co7kt zmRC0QS$y5Uv~{6MJ*@pYviXa-I8LiJ4@dWe^M)5vh2U*5%qA=moxRfUHSn? z+$A(4CbDHDpZJJ*3nkaNIhGfXeh1a}eoG%DR(2R)^P1L}u}zExc7UWzFfqR|IHO=a zO*x}m*w}lGIgXcZ_LpC=DEk^~=tXmi%qyTkA*;ji^5D4&v!Y%q2*xND8@r3_@a30S zTQ>=$XcgkRiKp_a21P>PUricsQ$Pp`b1hb%S)@m9*-t>2diIa+s3v&LrqAD33X)() zuw=FC(4)xpYI7J2K{uYm20^{i+CkD>siv%uk@QFwc{=p*-rLxg`Sh#88+!$*n`XUW z3KUmdKbI|5mD7Ilfn89)Hn5nK>V?mD(MFHq)=vF+`)#%8dhww7azF5zl9Qem770IwGLkwE9rIgb`0V~!xx}?D*)w%~JJr5E9?0vjo+6|q z^oD;SH6@5Gnj+V=aya)nH;`>A_ZC*Xu_N3_X$;-}|~X-m7?m9TD5O7@3>3UA7j!TaZMPokJ&lGnwDuoo~+?bYeQ+3 zi3W1Ho4&ZsA^NKt`{+tmrSX$8ax4wzGd}YAyh4`FwM5XW)`{FF7tYrkK_mapN}tdX zBCzYndOQGtJ^Lg?ulMuw^uX@mUf2As;)9%pNrj3YVxrG3)f+eb!%BBdBiUPmFTAte zWykZ7d{(}5Rmb7GBL8T*aPgDn51>vDHGFG{v!6eF3qgYj3aCf6ua6MPRLPIp$z>XR zjx|$Os)8@=Z^Y94-(fD%&W1>UE@5m)Mz1b?;$gFnaI#c5YMc?dTjQ{MMY}(f!Cfmf z$o4bf>wxO`Ly>vZ+C3i|2D;evR{;Z>7H)1S)M799S9o*$GUtQpm@JA?PX`{*1=2witCBX;|`s2Ixl+I)QJ)GbDA5;B>tcG;{0# z9w+AaW|z3e?(3fV24OaI?xl8eT-olCwaaUxh+R{2P47eXs6MHeu%)w*BDr~hRc-Cu zZe`CtNCOJggfH8v1|p9UNZZXSpXAo`pE!Pp9gjqM^*t+Cin&jW_~SBxKB--}{6`Ni zucHBUI9Kgwi<})Q_lbqg1O!rBX4_DcCVNhZ#yyZ`r4I~Z8RTcGI9cM*IMs44>ko_cBbvD-9ga4hP1DPhm4GD_@R7{Ks;2VL1YYS~ z3*wH6Ip1?8V_vKqeLBH1`Cn}r=R|&MUi&i2=6fIX&o(JzBCn8zE5UB}BD@5D#2E*X zZPaN(6s6*N6jD$|mxGNh_%gM3bcR*U2lTRKXZ#14%M}z~d|70Pob4a38It>mPM@$1 zGLE>ebMrNC=0!-Yf7Q1d?U|!~#;9osN)>G%(!zqV6P(wbaEwW0l_n-&lRd02O(IsT z?Nu)!ic}99mNFJ#bkIK3jf86;X)VkD9y1fCDT@sV4tAzzU1^g8DP*w)J6Fr}eE~s@vUnFV7PD^5Aop9itE%kPt z#Bkfn%rVt4YI-bQji%B3Cal-w!9mG6VGu9Y038e-12x0uGM+4l#8|0yo!PKfvu^X@ z94hylywzMK&~5AiH))j48u?+p$Z0KE6yx)Ps2i|HEAG4OujIYCH~f}_|8oPL20DYEI1Br@$*VzLfc)>yvs>GQ zy^xPJ=vog*t)TGGLo*54fJ|jIj9BO*(E1eKFZ4q>(whXA?-#mi9i}fG+3UvMJ4Eq> zfzU=dw;lSjwYs3x)D`!YtqC#Pd(13zxw7$P-FL$gv+g1!{mN$Zt%4{1V zu6h*Hul!Go3`EvOGM`c~xCNhz#*0$*)E#f=r$fTvw}uE zG*}C|AiVDWM@*pVu9Gl5PHiZmGH{k%+pqug*-S+ykf>P*a)|AEe-wpZG9fL~^{SQE7}M|KU*eXDt^wJ}PZb7eM$ z)o;9TWyHmvn2M}B$S zTC2hjXFgPzR6`vz(aCf!NAX1beCJ)mCt*6Q;r+h&8-K8t7P+9Mhot;)w#+`5NuO3< z#(A4%H612rz|g9=n=mF^=yVS(5mH`t9N5qcjl$oa)Ozz+2XV+a`ox$4ii3DJy|lkR*QJOm z+&a!GQ}nFAuVznbSj&|Kf4F%CF^=x#&1yYj%Yh6s$NAL zzT9W5yO|_ZiAZL+k0m`vOE7mH4UWFcbFVHUNjkk0l<>ULDUcyG^b6@&IZn2#s<@De zJi+|}d{Xwyb=ruh z8^*8n!X(R$A5xD}_&~CJ6~}aC?nyJca~V=?gxGcMOLZ(gZ8xa$nr0LUg}A@VS2p>c zznGwO$=*A$@C;|el^{gRrfv4&fyV0;dgAWiVa{0f*OsYG!!TysWW|U$vycF`FmV_0 zls_(+nQo69hWtso)#5o#kvD>t3&g5fDA)48h)$s6*AuKttp#g{-rM*{xe&pIw4~N^ zhUc;h^Pl{Tz+KQU;C)>u%^>@o7nFOKrac_cVRr6f7u?D^o+tcj^EsB?q_(E&8y-AC zs&D+wz{X0HAnF_Xc9FaU)FAEOm#9bkVuiNPz$Q|{dqoyXXvwiQ_-P5g#XzTi?IwTt zQT5#K@yMQO9iF{gtu6tkseSJ!g(bNpt=*p&tlqz6z*?nv|Nc%#A(!a_;kr>}E#RvJ z^5U7Q<_W2EVvgb>Rb9QOCmiO#l)>kY>_7Z4-Z(2H~xwzT?n9~R@gnjw`@vQEbnO@ zJ*J?^N;GM&WOHAI`gy=5u{ox#Oa@I%^n7;itSNU(Z)AkMDqTtfV2xG&cL?f`P<2?76c5x<@+$q|DqK|BOi~-v>l{4(4 z@Qz4UA9vSFwRva8*7^jomiURKjD4;!8npae&7y^3rDo^+16(m`^+&t`om%GbwPs@K z!EMC~^i;iHTmG zrrs4^sIn2dOh%N-6c@Q|Cc%=(OOZ-Bhb~IFr1SEMO2poYzwp^yx>s8GQcTfJO-<%% z=i|b~cDTuhJZp?qfK9bd6GdYu{6uc_TGX&ta-fT2?*5rSGT zuM3+gkBJBcA|jJRO?(7pj!m}Cv~-e&C8nrb+iSrA^}k=3@cz2hndF%uYrk%EhkRay z!*kAG6=kY*^*W!Xh-5J}K>l4=0WFwMjMB*VP@Eh;EW~$n|0l2boi8 z(RPFBTEczN-6ZorEQE|_3PB*6?rVykoNRuyzcCBZM`Y9D*XCIpy9ZpshF;V_7s0RS zI*fJa^_et3(N91v*B4|aX)?LsRjqQ41!OaC(Vzse=hOWE(|I9_$E?_hw9w4W9&_$V z!+el{JYJqFQNCUR%Z0JFhoHi#_n)<1TMUV37L-MI%~!w(i4r1oh{jTDYV$t%d9ZO{ zwnQFv@abV8t2u7n_>4oQ*l=;K)IF_UW2ghu1dt=iB{>IiU(Ge`MU-f&ob0Bl zugX=wlzG9UnVO^Kf=IK3;3z8-ld*$(&W)D)Q5LSzN4X!8U%JjFK{9v0~CdDvop|-{qYs z`-WP2V(1?QC(rBoY43wnBW!E`TXwzyPR=oNT8lySl{qJV)ZEzrCh#}5<<504wPJ^Q z3!e<+aBjwh!x%v)-9}!D5Ys}S9&tBs6q)6fhW(c*<*7H7RQk~)eIjD1*w_x97+hx? z{I!0)-9mU$4sYhj-1Qw^*feXjcdjG^;r$dEs=PD%0+xSO;YWZ`o07iSk{mA{U_M-W zAt4M~_T$k`J-2Am-v2<#b5?DkStm(f@Kt*PO4)p!cW&}#1YdeLG&J{OzfVt3YUbN8A*$twi9>4K|>cB(x7L~r6o39**8dw zYHU|scIA?>EWXYd)AjT(*}3*US)AAqWSH-tw7{ff_9M6cu5gbTfBToJpiS#PuEPH^ zYJ~nQoER0#WlXy8nSxH9Q#7xRP-~R~cAzYGhQ+_26id(zPvk$yFC=m-RyQg|?JS+G z&e$<=8*GyIT`33)Xz@+mGQJ%M;;>DS@sJrSRZAVZ-06En{?I9vy59u!vi(0_dwokl zL0l*KwXg@*seD3fW}>3J8}BB#OV8!L2_Iz1wBr)HTUw-6iAsWMlGlr;*AHuIrx1O* znK#|KB+*i(_yP~~A32s6ZE2hzSPhW#>G~l`)Q~H9z4LzFT9ymUDd>^ZoGwL73nc>I znk9?&kv@=WG?JeH+oj_DocX~pa32h9Wzx6Nf!JF!Z>wuo&ufl}SjtoS>J~N+SD(t2 zJiB#c>9%?MFqO2w_~3oVdBf_;F@izVd$Xc^#|EJ*5)A^+ByJe^XMGOI+n4h^J%)8j z!jkXUj@>kR^ZUgGfcN?I120;+ZYLzY6CAm+q0I2A$#QtMX6y~|Zf%0+ z0-MS=uc^4_2mjez7P)FR-K9|)j3Gs?m~?|#Dkb^>q1+&}e1fq;;7j_#A7OtE!R$-J zn6e|rFdcIKL zR^)QmWYs?4b;3mpb3+fO+FA0nem^O-MaT|OuDL4Q5EiR{+nf_?zD~O=`5-t*K|RBL z{N>TGdd+e#=F?iwe~)yoIRD3^-y&7ge$5mv3?uy%w(sWh0r40s=$`?tFFo53I{z(E zP$F@U;#tR%0$wL1!>y-K%fVoJNs*BFg}lN5n+HQ6-8)*yAi0+xHMxk}$>vaa`z!nE zea@9T>|7wE7jYoPFj$vV^>k*(nAci9!L0WWj_}4=FeV5UVgG?k_fC&Q^NIGoI5T0I zoqaX0fiM?dol&$~$F?w3rzP!RCRGd_6E{eYLodrc*it9%Q$T^8vdey=kW3hXU$EIr zDw(48As9iGRQN*Dw&y={h)LY1+>iew!HUN9dqF3>nOwy>NSOSLVSk<(vzd^$oh(Q% z3F6U^=q5fWDpP76F|S+oYlVn0dfz&Kn}sQ?=u_eyBRLjc7n=+KpHVhg{v*k95&2Jp zxw9ksJerPM8_b!waz>aEP*BbM8+|=sJv5~=XrAIC3nM-zcS_Y#M@n1X8Y#L~c^~GJH*ml$X%-lGg%T!z75r@plTD{OXL+Fl+R?B9De}D%>_X?a?_NL4K>~#C(6xJ?TVo^E0B&vdn||c7c_* zHu#h1Mns0x2&Fd168ukc1Yie1k^Yn)#v;h&=fidp;3s@&eB`p0^l_9R>zB7iTvQU{ zf})pn;y!t*(BkTKPgmxAESq{F+6v~Qq&*ZXcF%w=yf7pf+blev5OkoC2ZZTPrR{Sf9|LOkjyE6N*$K2?KdI)~307dRlnVMZn}nJH+}AnAYUa^e1YjREsumo?97* zSz{EL8nc;z`gMI|}KpCP=N0U3ODb^5IyzU_$}1P8Z^6pytIHh$ZQ3#vj33ymLnCx?h&!q$dhgTh`ine_TsQZmXEy z+}kTjb@lBNUfHx`(ifp!$k=*)iLbyT)qHLumnWRN!w9M3dNrC*S#>4SrhN}*ch?<(#CXeSuS9YsiiWE>K^MnJ_yC=K%| zPzEucriPQdXKMb6kJ833~~9c+gX7s zRPpJIQbj7Nn8TLH$On#nDlav83%4ZXWN;}&ilKw3lN}GOG!`yK<~^BJ3d@yc#wij| zWB?F3`9b2VM>{lrSalJcl~6wE{&hS8Oce}=12}8~ew18Zgt16sm&}VfJ=cOM%PZxB z$+$NgN*w3wP(<+`-$pjR?oe=kzLbqSGPjx)V+R8xBvQC7$^6KSE*V5%92U-VOpa1X z2)KpyJotV?o(K8uR5a~QOKC(C?hTw*M0W|d6%NC&=~(*R zf?PXDjq{#xItoidyp2fil0;_{oy>8uM;Q9lQp+C#Fsu0Wu71kx?d1^7@-R3Dt!>-O z0|H9rvBx;3A^TL5$t*d-_NK_Gl^N^l-kOeb70RIZ?@jX#{I?^w(v5*?NFQztfwrDF zsNPjZ{o3@X!BD%&AZH+Yn#{hxef~sQG9EAoN;Mj={YLUhX8SA|X`lPOMQiEy38UK~ zERT622Hl<8bJ+XSG&^Xtc)rtj620S$peOxbq5At&QoB1DBw|Y*Sofxddy71wq{EV1 zJf5b8Wh9JX=Zy1E=j9|Eq)=n+T4@eQ&a^b2RJ=X zT5)A0kqyPy{F^@`X z9FlTyJ5n9TFwe`5J!&`JBgh%&k(zjH0iNFU#eB#B>5eM4LL7czJx6M8;Oe-~xfC`5 z&T+W|_zsAkaR1 z;B@uxMoxPB(jJ=(lXGwn0+gSZ1mN@(?wk+Km{bl4>(Y*(8Rwp~)3js)54}Hu+uEZl zG4I-dxB-sz(g|Ql_B7#<*abo6k&^|X({GU)JTUpY z8l?lYGHstFdlTA?wi$92Bj!AxdX$iO9jOL3{JG?Hp@$h5#R3ty;NVk8KHO7}PWh)k-$JU*Z+Nrw$@zCTBX?Zvqrk}b$T3q3I=}zJvIp?=dDBzGt z#WbFH81|(Nkx8+lPIq?vr~ndA>rv!^oEmyDBerM)L%{1yKQGLFpIQm|vN6R9bM&I& zsUT&?ew+$Z&jbu(nrOi3=}nVyafZMilrXi5*9vW)%#ZG#qOHLwkv9&MyH$Y5vNzDbYGQ65VJb}FW zx8u z9D36`0DAM9P|O%-r3?iGDcs#i=|q!lA29>hJYtygEJ*J70ejass%kBDAyoNe2aI>A zxpp;gHJD>1Vjg1;;yen>lUTcMl5O@Cn9Y;xnrY54ns;GiO?6Aa-|L(4tF~I~vEd~^ z%lTFTC)R*zb1~TOY;Rz=T*Q6IJ*sudZrgo*Yl64Ak|)YJQV*?lI!>t-(yTI_jyv`> zYgA3FYO9URc9vy5I#r0=51ZGXY7z>9a5{CS#&MPBlR_rtpD|1uhDLol)Ul~pz{Ydy zRnkCMjOQHGxendN260J;LRC;3mCk#LduIT1=sD(^2;YD@if_(a0f5KesRGP+URaWS zJt@F((415RpS&~Dqz4!rmK{cUrYjN*o{W0u6sAYOay#Oq0PiGlJ&!?8Bo)8|K9pQ! ziI(}#80=3!g(DKdh+clR8Zlw8W7?z=5>=FPI-Jz*8zR7zg$uM}0QKunNfBf&%E5YI z9+d!S$?Lg^>5i1(#nWl~+rLVt#nhdpWPKK40Di2r@v}~QbATF z8F9Cc)Y7WF#?0Vg2F3GtzVR4x^|Q8ZwsLUyw7;@}@McxrT7WbGDB`>(s5QStRON01ekY>n_sj zOIbt{5(=Ie*2+JcnURQP7y~s*`qWPz3Z4CqDGa$C#8N0Po<|ro2{3R#3G3du=%<#} zVFkfELHSKjf2jnBLVz=q^5UpT7BwsOQeudF$Atr&d)AhNV7hWG_0U;vAMT@n54}O5 z=}85b_MW1^NhW-#`kehLONq?VnKyj+$I^?6>G}`5nn`XRMkJi%lho8o>{Yj99>Wya z1 zPeJP0C{;NJ4UUI7rU$?yX~i`$lg2%14$^m%kH(nx9H$3AmT4Ro7$+chq>=D`UPVQ} z90SEW6Xr@-009`!6&%AVd*|MxE?gcl`cO_3C_QQH0Ij$c!Q+l7&eq81IT`Iu!OndK z1tHGN6Q89W2Y!QzB=9hL=hl^2V;C8z)UaG*80|(Ew+4$KB_)f32*K;#o40cgn9hCb zF#iBB7{CXm5wRqeAo_aL+qqUH+mEMCXvjQs$3smd1{v+%k%t{=Td_Kel1RYs$)q5T z+qtCY85~es3z5k*^$h{AN4+;6HZx2@+2G)3@udZ^(0Wox80G++o+%fvTv856E!BEb zDfz#Z8V^ydjl8(WG>1Jlj1SVD$F_5x^&4azzsioFDubQ?+e~qp0qOYDx%;{8)|-=# zNXetjPiqU%mPb{wxGO=r#U_SXlx#o)o{QS=|^wpN$ML7Bzkgv=m$9%??Vy=Cu~t* p8r}N)(stx@pyxc(MsRt}1F$wT)2%e*9+Uz`1uGuk(wipd|JgL1FDC#1 literal 0 HcmV?d00001 diff --git a/specs/kbd/scancodes-1.html b/specs/kbd/scancodes-1.html new file mode 100644 index 0000000..dff2811 --- /dev/null +++ b/specs/kbd/scancodes-1.html @@ -0,0 +1,418 @@ + + + + + Keyboard scancodes: Keyboard scancodes + + + + + +Next +Previous +Contents +